2 конструктора копирования по умолчанию: возможно ли это?

Является ли следующая программа плохо сформированной?

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).

3

Решение

Почему это должно быть плохо сформировано? Вы определяете два конструктора копирования, один из которых ожидает неконстантный аргумент, а другой может использовать константный аргумент. Затем вы говорите компилятору, что он должен использовать реализацию по умолчанию для этих двух конструкторов. Если у компилятора нет причины удалять конструкторы копирования по умолчанию, вы также можете удалить эти две строки и получить тот же результат. Также я думаю, что первая версия избыточна, так как реализация по умолчанию в любом случае должна быть в порядке с аргументом const. По-прежнему определение обоих является законным, так как вы можете захотеть сделать что-то другое в обоих случаях.

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]