Неявное преобразование приводит к «ошибке: получение временного адреса» (GCC vs clang) - PullRequest
0 голосов
/ 28 августа 2018

Экспериментируя со строго типизированными целыми числами, я обнаружил странную ошибку из GCC 8.2:

ошибка: получение временного адреса

Я могу представить типичные сценарии, в которых вышеуказанная ошибка имеет смысл, но в моем случае я не понимаю проблему. Минимизированный (надуманный) пример, который воспроизводит ошибку:

#include <cstddef>

#include <type_traits>

enum class Enum : std::size_t {};

struct Pod {
  std::size_t val;

  constexpr operator Enum() const {
    return static_cast<Enum>(val);
  }
};

template<std::size_t N>
constexpr void foo() {
  using Foo = std::integral_constant<Enum, Pod{N}>;
  // [GCC] error: taking address of temporary [-fpermissive]
}

int main() {
  foo<2>();
}

Почему GCC 8.2 жалуется здесь? Clang 6.0 доволен ( см. Goldbolt.org ).

Обратите внимание, что существует вторая ошибка от GCC, которая может помочь проанализировать проблему. Я тоже не понимаю, что:

ошибка: нет соответствующей функции для вызова Pod::operator Enum(Pod*)

Полный вывод из GCC 8.2 читает

<source>: In instantiation of 'constexpr void foo() [with long unsigned int N = 2]':

<source>:22:10:   required from here

<source>:17:50: error: taking address of temporary [-fpermissive]

   using Foo = std::integral_constant<Enum, Pod{N}>;

                                                  ^

<source>:17:50: error: no matching function for call to 'Pod::operator Enum(Pod*)'

<source>:10:13: note: candidate: 'constexpr Pod::operator Enum() const'

   constexpr operator Enum() const {

             ^~~~~~~~

<source>:10:13: note:   candidate expects 0 arguments, 1 provided

Compiler returned: 1

1 Ответ

0 голосов
/ 29 августа 2018

Это явно ошибка; 'Pod::operator Enum(Pod*)' это ерунда. Вы не можете передать аргументы operator Enum.

Компилятор, похоже, считает, что правильная операция для преобразования Foo в Enum во время компиляции - foo.operator Enum(&foo) или что-то в этом роде. Это объясняет и «временный адрес», и следующую строку.

...