簡體   English   中英

為什么boost :: shared_array的顯式構造函數會導致錯誤?

[英]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_arrayT*構造函數是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM