c – 在保证副本省略的世界中的构造函数实例化

前端之家收集整理的这篇文章主要介绍了c – 在保证副本省略的世界中的构造函数实例化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
考虑这个例子:
template <typename T>
using type = typename T::type;

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

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

由于没有嵌套类型typedef,gcc和clang都没有编译这段代码.但是为什么构造函数会被实例化呢? f()是与g()返回相同类型的prvalue,甚至不应该在那里移动.是什么导致我们实例化坏构造函数

解决方法

构造函数有点像红鲱鱼.如果它是任何其他成员函数,也会发生同样的情况.
template <typename T>
struct A
{
    void foo(type<T>); // Same error
};

这是因为[temp.inst]/2

The implicit instantiation of a class template specialization causes
the implicit instantiation of the declarations,but not of the
definitions,default arguments,or noexcept-specifiers of the class
member functions,[…]

声明被实例化,因此键入< T>必须是良好的形式.

猜你在找的C&C++相关文章