[英]Why does explicit constructor of boost::shared_array cause an error?
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,但這是錯誤的,並且我知道在這種情況下而不是operator=
將被調用constructor
並創建指針通過new opeartor
。
但是在吐出這個我得到error C2440: 'initializing' : cannot convert from 'const char **' to 'boost::shared_array<T>
我看到的唯一問題是boost::shared_array<T>
的顯式構造函數。 但我不知道是什么問題? 為什么顯式構造函數會導致此錯誤? 如果問題不在顯式構造函數中,那么在哪里,為什么?
你的猜測是正確的。
你在第二行嘗試做的是隱式調用構造函數:你希望C ++編譯器意識到有一個可用的構造函數接受一個T*
並使用它。 但是,由於構造函數被標記為顯式 ,因此無法以這種方式調用它。
例如,參見http://www.go4expert.com/forums/showthread.php?t=20756上的討論。
是的,“問題”是shared_array
的T*
構造函數是explicit
。 禁止用=
構造。
現在讓我們來看看第二行。 在我看來,我們與第一種情況完全相同。 是的,乍一看我們似乎在這里我們通過NULL(shared_array構造函數參數的默認值)然后調用operator =來構造x,但這是錯誤的,並且我知道在這種情況下而不是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和干杯,:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.