Экспериментируя со строго типизированными целыми числами, я обнаружил странную ошибку из 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