保证复制省略的构造函数实例化

时间:2018-06-26 13:51:26

标签: c++ templates c++17

考虑以下示例:

template <typename T>
using type = typename T::type;

template <typename T>
struct A
{
    A(type<T>);
};

A<int> f();
A<int> g() { return f(); }

由于int没有嵌套的type typedef,因此gcc和clang都不会编译此代码。但是,为什么要完全实例化该构造函数? f()是与g()的返回值相同类型的prvalue,甚至不应在那里移动。是什么导致我们实例化错误的构造函数?

1 个答案:

答案 0 :(得分:9)

构造函数有点像鲱鱼。如果是其他任何成员函数,也会发生同样的情况。

template <typename T>
struct A
{
    void foo(type<T>); // Same error
};

这是由于[temp.inst]/2

  

类模板专门化的隐式实例化导致   声明的隐式实例化,但不是   类的定义,默认参数或noexcept指定符   成员函数,[...]

声明是实例化的,因此type<T>必须格式正确。