2011-03-26 2 views
3
boost::shared_array<char const *> x(new char const *[n]); 

В строке выше (n это целое число, не превосходящее 100) Я создаю char const** (const char**) и положить его на смарт-указатель x для массивов, которые будут удалены при x удаляется. И для меня ясно, как и почему эта работа.Почему явный конструктор boost :: shared_array вызывает ошибку?

boost::shared_array<char const *> x = new char const *[n]; 

Теперь давайте посмотрим на вторую строчку. Здесь, на мой взгляд, мы делаем то же самое, что и в первом случае. Да, на первый взгляд нам кажется, что здесь мы строим x через NULL (значение по умолчанию для параметра конструктора shared_array), а затем вызываем operator=, но это ошибка, и, как я знаю, в этом случае вместо operator= будет называться constructor с указателем, созданным new opeartor ,

Но в косе этого я получаю error C2440: 'initializing' : cannot convert from 'const char **' to 'boost::shared_array<T>

Единственная проблема, которую я вижу, это явный конструктор boost::shared_array<T>. Но я не знаю, в чем проблема? Почему явный конструктор вызывает эту ошибку? И если проблема не в явном конструкторе, то где, почему?

ответ

1

Теперь давайте посмотрим на вторую строчку. Здесь, на мой взгляд, мы делаем точно так же, как в первом случае. Да на первого взгляда мы можем показаться, что здесь мы построения х через (значение по умолчанию из shared_array конструкторов параметра) NULL то вызов оператора =, но это ошибка, и как я знаю, в этом случае вместо оператора = будем be называется конструктором с указателем , созданным новым 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 и Cheers, :)

2

Да, проблема заключается в том, что конструктор T* для shared_array - explicit. Это запрещает строительство с =.

3

Ваша догадка правильная.

То, что вы пытаетесь сделать во второй линии неявно вызов конструктора: вы хотите C++ компилятор, чтобы понять, что есть конструктор доступен, который принимает T* и использовать его. Однако, поскольку конструктор помечен как явно, он не может быть вызван таким образом.

См. Например, обсуждение на http://www.go4expert.com/forums/showthread.php?t=20756.

Смежные вопросы