G CC: не может скомпилировать пример в разделе «Неквалифицированные имена» стандарта - PullRequest
0 голосов
/ 27 марта 2020

В ISO C ++ N4849, параграф 2 [expr.prim.id.unqual], есть пример:

void f() {
float x, &r = x;
[=] {
    decltype(x) y1; // y1 has type float
    decltype((x)) y2 = y1; // y2 has type float 
    //const& because this lambda
    // is not mutable and x is an lvalue
    decltype(r) r1 = y1; // r1 has type float&
    decltype((r)) r2 = y2; // r2 has type float const&
};
}

Но он не компилируется в G CC 8.1.0 -std = c++2a

Это ошибка? Или другие причины? Тип, выведенный в decltype((r)), не ожидается. Вместо этого выводится float&.

c:\Cpptest\source.cpp: In lambda function:
c:\Cpptest\source.cpp:8:24: error: binding reference of type 'float&' to 'const float' discards qualifiers
     decltype((r)) r2 = y2; // r2 has type float const&

1 Ответ

2 голосов
/ 27 марта 2020

Насколько я могу сказать, да, это ошибка.

Пример работает как в MSV C, так и в Clang; Измененное правило и сопровождающий его пример взяты из предложения P0588R1, которое G CC документирует как внедренное с версии 8.

...