3
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 构造函数参数的默认值)构造 x 然后调用operator=,但这是错误的,并且我知道在这种情况下,而不是operator=将使用constructor由创建的指针调用new opeartor

但尽管如此,我得到了error C2440: 'initializing' : cannot convert from 'const char **' to 'boost::shared_array<T>

我看到的唯一问题是boost::shared_array<T>. 但是不知道是什么问题?为什么显式构造函数会导致此错误?如果问题不在显式构造函数中,那么在哪里,为什么?

4

3 回答 3

3

你的猜测是正确的。

您在第二行中尝试做的是隐式调用构造函数:您希望 C++ 编译器意识到有一个可用的构造函数接受 aT*并使用它。但是,由于构造函数被标记为显式,因此不能以这种方式调用它。

例如,参见http://www.go4expert.com/forums/showthread.php?t=20756上的讨论。

于 2011-03-26T11:12:46.393 回答
2

是的,“问题”是T*构造函数shared_arrayis explicit。禁止使用 构建=

于 2011-03-26T11:10:05.500 回答
1

现在让我们看看第二行。在我看来,我们所做的与第一种情况完全相同。是的,乍一看,我们似乎在这里我们通过 NULL(shared_array 构造函数参数的默认值)构造 x,然后调用 operator=,但这是错误的,正如我所知,在这种情况下,而不是 operator= 将被称为构造函数并创建指针由新运营商。

这并不完全正确。这是一般情况下实际发生的情况。假设你有

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 和干杯,:)

于 2011-06-28T22:02:23.300 回答