它看起來像Visual Studio
只是當它的默認參數是初始值設定項列表時調用哪個構造函數時被破壞。此代碼:
#include <iostream>
struct test {
test() { std::cout << "test()" << std::endl ; }
test (int) { std::cout << "test (int)" << std::endl ; }
};
void func(test const &s = {})
{
}
int main()
{
test s = {} ;
func() ;
}
產生這一結果的gcc
和clang
,看到它live here:
test()
test()
而Visual Studio
會產生這樣的結果:
test()
test (int)
與此代碼:
#include <iostream>
#include <initializer_list>
struct test {
test() { std::cout << "test()" << std::endl ; };
test (int) { std::cout << "test (int)" << std::endl ; };
test (std::initializer_list<int>) { std::cout << "test (initializer_list<int>)" << std::endl ; } ;
};
void func(test const &s = {0})
{
}
int main()
{
test s = {0} ;
func() ;
}
gcc
和clang
產生這種結果看到它live here:
test (initializer_list<int>)
test (initializer_list<int>)
而Visual Studio
產生這個錯誤:
error C2440: 'default argument' : cannot convert from 'initializer-list' to 'const test &'
Reason: cannot convert from 'initializer-list' to 'const test'
No constructor could take the source type, or constructor overload resolution was ambiguous
更新
對於一個全面的檢查,我又回到了標準來確保這種差異的根源不存在某種奇怪的規則,或者也許是如此我的限制,使這個代碼不合格。據我所知這個代碼不是不合格。第8.3.5
語法特別允許這樣的:
parameter-declaration:
attribute-specifier-seqopt decl-specifier-seq declarator
attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause
[...]
它似乎並不像部分8.5
初始值設定或8.3.6
默認參數加任何限制,但這種缺陷報告994. braced-init-list as a default argument和工作文件Wording for brace-initializers as default arguments說清楚,它的目的和概述了對該標準所做的更改,並允許它在查看三角洲時沒有明顯限制。
'return 0;'丟失,但似乎沒有關係... – Mario
@Mario,不需要。也沒有關係。 – sehe
@Sehe https://connect.microsoft.com/VisualStudio/feedback/details/809243/c-11-initializer-lists-as-default-argument?我不知道它是相關還是相關。 – 2014-01-10 12:56:38