Es sieht aus wie Visual Studio
ist nur in Bezug auf den Konstruktor unterbrochen, den es aufruft, wenn das Standardargument eine Initialisierungsliste ist.Dieser Code:
#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() ;
}
produziert dieses Ergebnis in gcc
und clang
finden es live here:
test()
test()
während Visual Studio
produziert dieses Ergebnis:
test()
test (int)
und für diesen Code:
#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
und clang
produzieren diese Resultat es live here sehen:
test (initializer_list<int>)
test (initializer_list<int>)
während Visual Studio
diesen Fehler erzeugt:
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
aktualisieren
Für eine Plausibilitätsprüfung, ging ich in den Rücken Standard, um sicherzustellen, dass es nicht irgendeine ungerade Regel an der Wurzel dieses Unterschieds gab oder vielleicht Ich Einschränkung, die diesen Code macht schlecht gebildet. Soweit ich das beurteilen kann, ist dieser Code nicht schlecht gebildet. Abschnitt 8.3.5
Grammatik erlaubt dies ausdrücklich:
parameter-declaration:
attribute-specifier-seqopt decl-specifier-seq declarator
attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause
[...]
Es scheint wie Abschnitt nicht 8.5
Initializers oder 8.3.6
Standard Argumente keine Einschränkungen hinzufügen, aber diesen Mangel Bericht 994. braced-init-list as a default argument und Arbeitspapier Wording for brace-initializers as default arguments es, dass es klar machen sollte und Umreißen Sie die Änderungen an der Norm, um es zu ermöglichen, und mit Blick auf die Deltas gibt es keine offensichtlichen Einschränkungen.
'return 0;' fehlt, scheint aber nicht verwandt zu sein ... – Mario
@Mario, nicht erforderlich. Auch nicht verwandt. – sehe
@Sehe was über https://connect.microsoft.com/VisualStudio/feedback/details/809243/c-11-initializer-lists-as-default-argument? Ich weiß nicht, ob es relevant oder verwandt ist. –