Получение адреса rvalue
Почему версия GCC >=
10.1
производит
taking address of rvalue
ошибка со следующим кодом? Или, при использовании вместо этого lvalue, почему он выдает
no matching function for call to 'a::n(a*)'
ошибка? Откуда берется параметр указателя? Clang, похоже, прекрасно принимает код (и более старые версии GCC). Компиляция с
-std=c++14
или же
-std=c++17
приводит к такому же поведению.
Пример кода :
struct a {
constexpr auto n() const { return 3; }
//
// static constexpr auto n() { return 3; } // ok
// auto n() const { return 3; } // ok
};
template<typename>
constexpr auto f() {
int{a{}.n()}; // error
//
int(a{}.n()); // ok
int x{a{}.n()}; // ok
}
constexpr auto g() {
int{a{}.n()}; // ok
int(a{}.n()); // ok
int x{a{}.n()}; // ok
}
Выдается ошибка:
<source>: In function 'constexpr auto f()':
<source>:10:14: error: taking address of rvalue [-fpermissive]
10 | int{a{}.n()}; // error
| ~~~~~^~
<source>:10:14: error: no matching function for call to 'a::n(a*)'
<source>:2:20: note: candidate: 'constexpr auto a::n() const'
2 | constexpr auto n() const { return 3; }
| ^
<source>:2:20: note: candidate expects 0 arguments, 1 provided
1 ответ
Как показано в комментарии и системе отслеживания ошибок gcc (Bugreport на gcc), это ошибка компилятора, которая была исправлена в gcc 12.