Visual Studio 2017 позволяет элементу ссылки инициализироваться с самим собой в конструкторе.Это действительно законный C ++? - PullRequest
4 голосов
/ 09 июля 2019

Я только что обнаружил довольно опасную ошибку в своем коде, и я чувствую, что она должна была быть обнаружена компилятором.Я ошибся?По сути, ссылочный член класса может быть инициализирован сам в конструкторе.Вот тестовый код, который компилируется в Visual Studio 2017 без ошибок и предупреждений:

struct foo
{
    foo() : reference(reference) {}

    int& reference;
};

int main()
{
    foo fooOb;
}

ОБНОВЛЕНИЕ: я вижу, что здесь есть аналогичный вопрос 2009 года.Другие компиляторы ведут себя так же в 2017 году, или это проблема VS 2017?Если они это сделают, это как бы подсказывает мне, что это законный C ++, но я не понимаю, как это могло быть.

Ответы [ 2 ]

3 голосов
/ 09 июля 2019

Другие компиляторы ведут себя так же в 2017 году, или это проблема VS 2017?

В то время, когда написано:

  • GCC и Clang оба предупреждают, с -Winit-self и -Wuninitialized соответственно.

  • Ни MSVC, ни ICC не предупреждают об этом.

Если они это сделают, это как бы подсказывает мне, что это законный C ++, но я не понимаю, как это могло быть.

Это законно в том смысле, что компилятору не требуется отказывать компиляции, но это никогда не то, что вам нужно, так как вы будете запускать UB.

2 голосов
/ 09 июля 2019

MSVC 2017: выходы:

предупреждение C26495: переменная 'foo :: reference' неинициализирована.Всегда инициализируйте переменную-член (type.6)

Возможно, вам потребуется включить анализ кода, перейдя в Свойства проекта -> Анализ кода (/ анализ)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...