Является ли следующая программа плохо сформированной?
struct Foo
{
Foo(Foo&) = default;
Foo(const Foo&) = default;
};
int main()
{
}
Это успешно компилируется с лязг ++ 3.8.0 а также g ++ 6.3.0 (флаги компилятора -std=c++11 -Wall -Wextra -Werror -pedantic-errors
).
Почему это должно быть плохо сформировано? Вы определяете два конструктора копирования, один из которых ожидает неконстантный аргумент, а другой может использовать константный аргумент. Затем вы говорите компилятору, что он должен использовать реализацию по умолчанию для этих двух конструкторов. Если у компилятора нет причины удалять конструкторы копирования по умолчанию, вы также можете удалить эти две строки и получить тот же результат. Также я думаю, что первая версия избыточна, так как реализация по умолчанию в любом случае должна быть в порядке с аргументом const. По-прежнему определение обоих является законным, так как вы можете захотеть сделать что-то другое в обоих случаях.
Других решений пока нет …