Вот небольшой пример, который демонстрирует нечеткий моментСледует ли игнорировать явный конструктор копирования?
struct CL
{
CL(){}
CL(int){}
explicit CL(const CL&){}
};
int main() {
CL cl1;
CL cl2=5; //(1)
CL cl3=(CL)5; //(2)
return 0;
}
Класс CL есть конструктор преобразования из междунар и конструктор копирования отмечен как явный. В (1) случай 5 (int) неявно преобразован в CL, а затем cl2 инициализируется напрямую. В (2) случай cl3 инициализируется копированием. В обоих случаях должен быть задействован явный конструктор copy-constructor. Но разные компиляторы дают разные результаты:
лязг и VS: первый случай, это правильно, но второй не так
НКУ: в обоих случаях являются неправильными
Я думаю, лязг и VS правы, потому что в соответствии со стандартом «явно» ключевое слово предотвращает использование конструктора в инициализации копирования, но не в прямой инициализации, а gcc неверно, поскольку в (1) случае применяется прямая инициализация.
Кто из компиляторов прав?
[Ошибка 54521] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54521), исправлено в последнее время –