鑑於以下代碼:在新的初始化程序存在的情況下,運算符重載解析如何工作?
#include <iostream>
#include <vector>
template <typename Source>
class ConvertProxy
{
Source const* m_source;
public:
ConvertProxy(Source const& source)
: m_source(&source)
{
}
template <typename Dest>
operator Dest() const
{
return Dest(m_source->begin(), m_source->end());
}
};
template <typename Source>
ConvertProxy<Source> convert(Source const& source)
{
return ConvertProxy<Source>(source);
}
int
main()
{
std::vector<int> src;
for (int i = 0; i != 5; ++ i) {
src.push_back(i);
}
std::vector<double> dest = convert(src); /* XXX */
for (std::vector<double>::const_iterator i = dest.begin(), e = dest.end();
i != e;
++ i) {
std::cout << *i << std::endl;
}
return 0;
}
是本合法在C++ 11,或者是線標記XXX
曖昧?
同樣的問題,但與標記行改爲:
std::vector<double> dest(convert(src));
或
std::vector<double> dest;
dest = convert(src);
在預C++ 11,我認爲第二是非法的,但其他兩個 絕對不是。
FWIW:克++(4.8.2)接受第一,但不是其他兩個(具有 -std=c++11
;否則,它接受第一和第三,但 不是第二)。 VS 2013接受所有的人,但智能感知 標記所有的人都是錯誤的(這是什麼觸發了我的興趣 :你得到一個不錯的紅色滾動條的標記,與 符號紅色下劃線,但代碼編譯完美)。換句話說:三種編譯器和三種不同的行爲。
(對於那些誰不知道,爲什麼:這是獲取上下文—賦值的左手邊, 例如—參與重載標準成語 )
您的第一個替代品'std :: vector dest(convert(src));'可能是不明確的,因爲[最煩人的解析](http://en.wikipedia.org/wiki/Most_vexing_parse)問題。 –
CouchDeveloper
@CouchDeveloper對於最令人頭痛的問題,解析被捲入,'convert'必須命名類型。它沒有。我認爲,第一替換(第二版)是(並且一直)曖昧,其具有可與單個參數來調用多個構造的任何類型。儘可能少的,Visual Studio 2013接受它(並調用我想要的轉換)。我正在尋找的是能夠向我解釋新的'initializer_list'構造函數如何介入的人。一些WRT rvalue-ref ctor將會很好,儘管我想我理解他們。 –
我可以看到'initializer_list'正在使用的唯一的地方是在返回值:不是'ConvertProxy