Рассмотрим этот код:
struct X{
explicit X(){}
explicit X(const X&){}
};
void foo(X a = X()){}
int main(){}
Используя стандарт С++ 14, GCC 7.1 и clang 4.0 отклоняют код, который я ожидал.
Однако, используя С++ 17 (-std=c++1z
), они оба принимают код. Какое правило изменилось?
Для обоих компиляторов, которые демонстрируют такое же поведение, я сомневаюсь, что это ошибка. Но, насколько я могу судить, в последнем проекте все еще говорится, что аргумент по умолчанию использует семантику copy-initialization 1. Опять же, мы знаем, что конструкторы explicit
будут допускать только прямую инициализацию 2.