Вызов конструктора копирования с созданным экземпляром - PullRequest
3 голосов
/ 22 сентября 2011

Я не спрашиваю о логике такого вызова, скорее меня интересует разница в поддержке ч / б Visual C ++ и GCC / Clang.Visual C ++ не позволяет использовать новый экземпляр объекта в качестве параметра для своего собственного конструктора копирования.GCC и Clang позволяют это.Учитывая, что 'int i = i;'разрешено, мне интересно, есть ли в Visual C ++ ошибка.

class test {
private:
    test() {}
public:
    test(const test& t) {}
};

int main(void) {
    int i = i;
    test t(t); -- this line gives an error in Visual C++
    return 0;
}

Ответы [ 2 ]

2 голосов
/ 22 сентября 2011

Цитировать стандарт C ++ (3.3.2):

Пункт объявления для имени находится сразу после его полного декларатора и до его инициализатора

В вашем первом утверждении декларатор заканчивается после int i, и поэтому имя i доступно там, где оно используется в инициализаторе (= i), поэтому оператор правильно сформирован, но его поведение определены.

Во втором вашем заявлении декларатор заканчивается после test t(t), и инициализатор отсутствует; имя t является недоступным , доступным там, где вы его используете, поэтому утверждение неверно сформировано.

Так что компилятор ведет себя правильно. Я надеюсь, что он может быть настроен на выдачу предупреждения о первом утверждении, но не обязательно его отклонять; необходимо отклонить второе, как вы говорите.

0 голосов
/ 22 сентября 2011
 test t(t); -- this line gives an error in Visual C++ 

Где вы определили t?Компилятор не физический!

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