2016-12-16 2 views
7

Предполагая, что у меня есть следующий (недопустимый) код:C++ конструктор по значению

struct A { 
    A(A) {}; 
}; 

MSVC дает мне:

error C2652: 'A' : illegal copy constructor: first parameter must not be a 'A' 

Почему компилятор обнаружит это, как конструктор копирования, а не обычный конструктор ?

Глава 12.8.2 стандарта C++ говорит:

A non-template constructor for class X is a copy constructor if its first parameter is of type X& , const X& , volatile X& or const volatile X&

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

struct A { 
    A(B) {}; 
}; 

в то время как B другой класс.

Где такое поведение определено?

+0

на GCC 4.9.2, ошибка: неверный конструктор; вы, вероятно, имели в виду «A (const A &)» –

+5

Вероятно, потому что это довольно распространенная ошибка, когда люди пытаются создать свой собственный конструктор копирования, который MSVS старался быть красивым и позволял им знать. – NathanOliver

+0

@NathanOliver: Мне это нравится. – Bathsheba

ответ

5

N4140 [class.copy]/6

A declaration of a constructor for a class X is ill-formed if its first parameter is of type (optionally cv-qualified) X and either there are no other parameters or else all other parameters have default arguments.

+0

Спасибо, это то, что я искал. Я считаю, что сообщение об ошибке просто вводит в заблуждение, тогда – tobspr

+1

Упреждал меня, что, 9 секунд? : P – Columbo

+1

Это говорит о том, что все мы знаем, конструктор является ошибкой. Вопрос в том, почему MSVS считает, что это конструктор копирования. – NathanOliver

Смежные вопросы