代码之家  ›  专栏  ›  技术社区  ›  Barry

在一个有保证的副本省略的世界中的构造函数实例化

  •  6
  • Barry  · 技术社区  · 6 年前

    考虑这个例子:

    template <typename T>
    using type = typename T::type;
    
    template <typename T>
    struct A
    {
        A(type<T>);
    };
    
    A<int> f();
    A<int> g() { return f(); }
    

    GCC和Clang都没有编译此代码,因为 int 没有嵌套 type typedef.但为什么这个构造函数被实例化了呢? f() 是与返回的类型相同的prvalue g() 不应该有任何行动。是什么导致我们实例化了错误的构造函数?

    1 回复  |  直到 6 年前
        1
  •  9
  •   StoryTeller - Unslander Monica    6 年前

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

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

    这是因为 [temp.inst]/2

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

    声明已实例化,因此 type<T> 必须成形良好。