为什么这里模板 Vector3<int> 无法转换为 Vector3<int>?

You*_*_ba 3 c++ templates explicit copy-initialization

看起来很奇怪。在这里您可以看到错误消息是一种类型之间发生转换并且失败。如果我从 Vector3 的复制构造函数中删除显式修饰符,那就很好,没有错误。有人可以解释为什么吗?我很困惑。

template<typename T>
class Vector3 {
public:
    explicit Vector3(const Vector3& v) :x(v.x), y(v.y), z(v.z) {}
    Vector3() :x(0), y(0), z(0) {}
    T x, y, z;
};
template<typename T>
Vector3<T> getVec3() {
    return Vector3<T>(); //c2440 "return":cannot convert Vector3<int> to Vector3<int>
}
int main()
{   
    getVec3<int>();
}
Run Code Online (Sandbox Code Playgroud)

son*_*yao 5

return Vector3<T>();执行复制初始化,它不会考虑显式构造函数:包括复制构造函数。这就是为什么您应该将复制构造函数标记为非显式的。

复制初始化比直接初始化不太宽松:显式构造函数不会转换构造函数,并且不考虑进行复制初始化。

顺便说一句:从 C++17 开始,由于强制复制省略,您的代码可以正常工作,复制(和移动构造)将被完全省略。