gpt4 book ai didi

c++ - 为什么这个初始化不使用我的(模板)构造函数?

转载 作者:太空狗 更新时间:2023-10-29 19:58:28 27 4
gpt4 key购买 nike

为什么输出是0003212?

#include <iostream>
using namespace std;

template<typename X> class C
{
public:
C() { cout<<"0";}
template<class T> C(const C<T>& c) { cout<<"1";}
C(const C<int>& c) { cout<<"2";}
template<class T> C(const C<T*>& c) { cout<<"3";}
};

int main(int argc, char* args[])
{
C<int> c1; // 0
C<double> c2; // 0
C<int*> c3; // 0

C<int> c4(c3); // 3
C<int> c5(c1); // 2
C<int> c6(c2); // 1
C<float> c7(c1); // 2
C<double> c8(c2); // ?

std::cin.get();
return 0;
}

最后一行意思调用了什么?

我可以假设它是一些自动创建的 ctor但不知道是哪一个。

最佳答案

这里有几个 C++ 语言规则。

  1. 模板不能是复制构造函数。 (标准规则 12.8p2)

    A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&, volatile X& or const volatile X&, and either there are no other parameters or else all other parameters have default arguments.

  2. 如果没有定义拷贝构造函数,编译器会生成一个默认的拷贝构造函数(如果可能的话)。 (标准规则 12.8p7)

    If the class definition does not explicitly declare a copy constructor, one is declared implicitly. If the class definition declares a move constructor or move assignment operator, the implicitly declared copy constructor is defined as deleted; otherwise, it is defined as defaulted (8.4). The latter case is deprecated if the class has a user-declared copy assignment operator or a user-declared destructor. Thus, for the class definition

    struct X {
    X(const X&, int);
    };

    a copy constructor is implicitly-declared. If the user-declared constructor is later defined as X::X(const X& x, int i =0) { /∗ ... ∗/ } then any use of X's copy constructor is ill-formed because of the ambiguity; no diagnostic is required.

  3. 如果模板和非模板对参数的匹配程度相同,则非模板获胜。 (标准规则 13.3.3)规则是一团难以理解的大乱码,我只展示重要部分:

    [...] a viable function F1 is defined to be a better function than another viable function F2 if [...rules about argument matching...] or, if not that, F1 is a non-template function and F2 is a function template specialization [...]

根据您提供的代码,仅

C<int>::C(const C<int>&)

是一个用户定义的复制构造函数,它打印 2。除了 int 之外的所有 X 都没有定义复制构造函数,因此编译器会创建一个。

另见

关于c++ - 为什么这个初始化不使用我的(模板)构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21210360/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com