模板的数据类型

Template's data-type

本文关键字:数据类型      更新时间:2023-10-16

我有一个名为Variable的模板类,它有一个专门的char*构造函数,定义如下:

template<>
Variable<char*>::Variable(char * const &arg_value)
{
    value = new char[strlen(arg_value) + 1];
    strncpy(value, arg_value, strlen(arg_value));
    value[strlen(arg_value)] = '';
}

现在,我有一个声明,它声明了一个Variable<char*>:

Variable<char*> stringVar = const_cast<char*>("Hi");

在我的Variable定义中,我从未向constchar*声明或定义过复制构造函数。然而,这句话做得很好。为什么会这样?我很肯定stringVar的数据类型是Variable<char*>,但这仍然有效。这项任务是从哪里来的?

采用一个参数的构造函数允许隐式转换。下面是一个更简单的例子:

struct Foo { Foo(int, double = 0.5, char = 'a') { } };
void bar(Foo);
Foo x = 1; // OK!
bar(2);    // also OK

为了抑制这种隐含的转换,比如explicit:

struct Eew { explicit Eew(int) { } };
// Eew e = 3;    // error
Eew e2 = Eew(3); // OK but weird
Eew e3(3);       // correct
Variable<char*> stringVar = const_cast<char*>("Hi");

调用类CCD_ 8的隐式c-tor。它等于

Variable<char*> stringVar = Variable<char*>(const_cast<char*>("Hi"));

您正在调用默认的复制构造函数。声明一个隐藏在您的变量<>中的变量模板并观察编译中断。

char hi[] = "Hi";
Variable<char*> stringVar = hi;

上面的第二行在语义上等价于:

Variable<char*> stringVar( implicit_cast<Variable<char*>>(hi) );

假设有implicit_cast这样的东西执行到目标类型的类型转换,当且仅当存在可用的隐式转换。在您的案例中,构造函数:

Variable<T>::Variable( T const & )

提供了隐式转换:Variable<char*>::Variable( char * const & )可用于从char*转换为Variable<char*>

请注意,虽然在语义上会发生这种情况,但实际上副本将被删除,代码将被编译为等效的:

Variable<char*> stringVar(hi);

也就是说,在执行了所有检查之后:从hi到类型的隐式转换是可用的,并且可以隐式调用复制构造函数。