Рассмотрим следующий код:
struct A {
private:
A* const& this_ref{this};
};
int main() {
A a{};
(void)a;
}
Если скомпилировано с -Wextra
, как GCC v6.2, так и clang v3.9 показать предупреждение.
Во всяком случае, с немного измененной версией, показанной ниже, они ведут себя по-другому:
struct A {
A* const& this_ref{this};
};
int main() {
A a{};
(void)a;
}
В этом случае GCC не выдает никаких предупреждений, clang выдает то же предупреждение, что и в предыдущем примере.
Предупреждения практически идентичны.
Оно следует из clang:
3: предупреждение: привязка элемента ссылки this_ref к временному значению [-Wdangling-field]
Какой компилятор прав?
Я бы сказал, что GCC ошибается в этом случае, и я открывал проблему, но, возможно, все наоборот из-за загадочного углового регистра языка.
private:
. Но показать настоящие предупреждения было бы действительно хорошо. - person hyde   schedule 12.09.2016private
, и я собираюсь добавить предупреждение, потому что вы действительно правы. - person skypjack   schedule 12.09.2016private:
— это ограничение поиска имени, и здесь оно применяется к поиску имениthis_ref
. Временное значение —this
, но оно не используется в контексте, где нужно искать имяthis_ref
. - person MSalters   schedule 12.09.2016