的static_cast
導致的std::unique_ptr
類似於您可以在下面的例子中看到的構造函數的調用
#include <iostream>
#include <memory>
using std::cout;
using std::endl;
class Something {
public:
explicit Something(int) {
cout << __PRETTY_FUNCTION__ << endl;
}
};
int main() {
auto something = static_cast<Something>(1);
(void) something;
}
如果你想知道爲什麼static_cast
導致的std::unique_ptr
構造可以解釋通話與標準以下引號(重點煤礦)
靜態澆鑄 [expr.static.cast/4]
的表達式e可以使用形式static_cast<T>(e)
的static_cast
如果聲明T t(e);
是公形成,對於一些發明臨時變量t
(8.5)顯式轉換爲一個類型T
。這種顯式轉換的效果與執行聲明和初始化相同,然後使用臨時變量作爲轉換的結果。表達式e
被用作glvalue當且僅當初始化使用它作爲左值。
所以在您的示例基本上陣列被視爲一個參數的unique_ptr
構造,然後將假想臨時隨後被用於初始化變量myptr
(在大多數情況下,省音)
的構造即在你的例子是所謂的下面cppreference頁面(2)http://en.cppreference.com/w/cpp/memory/unique_ptr/unique_ptr
explicit unique_ptr(pointer p) noexcept;
在這裏你會得到一個unique_ptr
指向數組。
然後,當您撥打reset()
時,unique_ptr
會嘗試刪除具有自動生存期的變量並導致未定義的行爲。但是,編譯器不需要檢測到這一點。
@StoryTeller修復!好點子 – Curious