boost::shared_array<char const *> x(new char const *[n]);
在上面的行中(n
是不大于100的整数)我正在创建char const**
(const char**
)并将其放入智能指针x
以获取数组删除x
时删除。对我来说,这显然是如何以及为什么这样做。
boost::shared_array<char const *> x = new char const *[n];
现在让我们来看看第二行。在我看来,我们与第一种情况完全相同。是的,乍一看我们似乎在这里我们通过NULL
(shared_array构造函数参数的默认值)然后调用operator=
来构造x,但这是错误的,正如我在这种情况下所知的而不是{{ 1}}将被调用operator=
,其指针由constructor
创建。
但是随着我的到来,我得到了new opeartor
我看到的唯一问题是error C2440: 'initializing' : cannot convert from 'const char **' to 'boost::shared_array<T>
的显式构造函数。但我不知道是什么问题?为什么显式构造函数会导致此错误?如果问题不在显式构造函数中,那么在哪里,为什么?
答案 0 :(得分:3)
你的猜测是正确的。
你在第二行尝试做的是隐式地调用构造函数:你希望C ++编译器意识到有一个可用的构造函数接受T*
并使用它。但是,由于构造函数被标记为 explicit ,因此不能以这种方式调用它。
例如,参见http://www.go4expert.com/forums/showthread.php?t=20756的讨论。
答案 1 :(得分:2)
是的,“问题”是T*
的{{1}}构造函数是shared_array
。禁止使用explicit
进行构建。
答案 2 :(得分:1)
现在让我们来看看第二行。在我看来,我们完全做到了 与第一种情况相同。是的 乍一看,我们似乎在这里 通过NULL构造x(默认值 shared_array构造函数 参数)然后调用operator =,但是 这是错误的,正如我所知道的那样 case而不是operator =将是 用指针调用构造函数 由新的opeartor创建。
这不完全正确。这是一般情况下实际发生的情况。假设你有
struct A
{
/*explicit*/ A(int){}
};
A a = 7;
这实际上并不等同于A a(7)
。在A a = 7
初始化中,您调用2个构造函数,构造函数使用int创建临时的 和 复制构造函数来初始化a
。当然,在大多数情况下这是多余的,并且允许编译器省略复制构造函数调用(标准中明确提到),但是 需要 一个,不管它是否决定省略通话。
struct A
{
/*explicit*/ A(int){}
private: A(A const &){}
};
A a = 7;
现在这将是一个编译时错误。如果向两个构造函数添加一些跟踪消息,您很可能会看到复制构造函数无论如何都不会被调用,但这并不重要 - 它必须存在且可访问。
至于为什么explicit
阻碍你调用上面的语法现在必须清楚 - 因为隐式调用构造函数来初始化临时语句,而不是a
。
HTH和干杯,:))