Предполагая, что у меня есть следующий (недопустимый) код: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 другой класс.
Где такое поведение определено?
на GCC 4.9.2, ошибка: неверный конструктор; вы, вероятно, имели в виду «A (const A &)» –
Вероятно, потому что это довольно распространенная ошибка, когда люди пытаются создать свой собственный конструктор копирования, который MSVS старался быть красивым и позволял им знать. – NathanOliver
@NathanOliver: Мне это нравится. – Bathsheba