0

我有一个名为 的模板类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)] = '\0';
}

现在,我有这个声明,声明一个Variable<char*>

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

在我的Variable定义中,我从未向 const char* 声明或定义复制构造函数。但是,该语句工作得很好。为什么是这样?我非常肯定它stringVar的数据类型为Variable<char*>,但这仍然有效。这个任务从哪里来?

4

4 回答 4

4

采用一个参数的构造函数允许隐式转换。这是您的情况的一个更简单的示例:

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
于 2012-08-31T18:00:51.557 回答
2
Variable<char*> stringVar = const_cast<char*>("Hi");

调用 class 的隐式 c-tor Variable<char*>。它等于

Variable<char*> stringVar = Variable<char*>(const_cast<char*>("Hi"));
于 2012-08-31T17:56:33.480 回答
1

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

于 2012-08-31T17:56:38.550 回答
1
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);

That is, after all checks have been performed: an implicit conversion from hi to the type is available, and the copy constructor can be called implicitly.

于 2012-08-31T18:03:32.117 回答