2011-10-19 72 views
7

這個問題也被提交給Usenet,它更合適,但這是一個更大和更可靠的論壇。std :: allocator的直接vs統一初始化

std::allocator::construct被定義轉發它的參數參數 包對象構造使用括號,又名直接初始化。

如果使用大括號,又名統一初始化,我們可以從功能,例如std::make_sharedcontainer::emplace初始化 聚合數據類型。此外,將初始化列表的內容 放入該功能的參數列表中, 可以解決轉發下的initializer_list類型扣除問題。

這個選擇是否被考慮和拒絕?在未來的標準中切換 爲時已晚?看來這將是一個突破性的變化,但不是一個特別令人髮指的變化。

+3

Stack Overflow大於_Usenet_ ?! :P –

+0

@Tomalak:大於comp.std.C++和comp.lang.C++。moderated,我提交的地方。而且比comp.lang.C++ madhouse更爲清晰,我沒有理會它。 – Potatoswatter

+0

你錯過了我的笑臉。 –

回答

9

我不知道SC在考慮什麼,但請記住統一初始化在通用上下文中並不真正「起作用」(禁止值構建*)。考慮這樣的嘗試:

template<typename T, typename... Args> 
T 
make(Args&&... args) 
{ 
    return T { std::forward<Args>(args)... }; 
} 

你得到:

assert(make<std::vector<int>>(10, 0).size() == 2); 
assert(std::vector<int>(10, 0).size() == 10); 

,這並不編譯:

make<std::vector<int*>>(10u, 0); 

,而這樣做:

std::vector<int*>(10u, 0); 

如果特定的相互作用完美轉發之間和初始化程序列表,導致這是正式的足夠快我可以看到SC不想從頭開始重新啓動。

(*):T {}即使在一般情況下也很好。

+0

Bah,做正確的事情構造。我還沒有被那個人咬過。儘管如此,還是有一個選擇。標準要求'std :: is_constructible :: value'對於'construct'的參數是'true';直接初始化可能是由UB保護下的實現提供的回退。 – Potatoswatter

+0

@Patatoswatt因爲如果使用直接初始化可以構造類型,那麼該特徵將返回'true',我認爲你的意思是說回退是統一的初始化。一個有趣的想法,即與當前規則向後兼容。 –

+0

是的,當然:vP – Potatoswatter