понедельник, 2 февраля 2015 г.

Специальные функции-члены в C++ 2

Здесь я рассказывал про специальные функции члены, при каких условиях они генерируются, при каких нет. При этом я не указал важный нюанс, касающийся шаблонов.
Допустим у нас есть код:
struct MyStruct {
    MyStruct() = default;

    template <typename T>
    MyStruct &operator=(const T&) {
        std::cout << "template copy assignment\n";
        return *this;
    }

    template <typename T>
    MyStruct(const T&) {
        std::cout << "template copy ctor\n";
    }
};

int main() {
    MyStruct c1;
    MyStruct c2 = c1;
    c1 = c2;
}
На экран, как не странно, не будет выведено ничего. В предыдущем посте я писал о том, что если определить оператор копирующего присваивания или конструктор копирования, то компилятор не генерирует оператор копирующего/перемещающего присваивания и конструктор копирования/перемещения. Но подобное правило не работает для шаблонных функций, поэтому компилятор сгенерировал все версии специальных функций по-умолчанию.

Комментариев нет:

Отправить комментарий