Получение адреса 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.

Другие вопросы по тегам