http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60009
Bug ID: 60009 Summary: g++ allows copy-initialization of an array of class type from a non-braced string literal Product: gcc Version: 4.8.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: ed at catmur dot co.uk The following code should be rejected, but is accepted by g++ 4.8.1, in both C++03 and C++11 mode: struct s { s(const char *); } a[] = ""; It is rejected by clang++ and MSVC. Credit: http://stackoverflow.com/questions/21481462/what-does-this-code-mean-and-why-does-it-work List-initialization is correctly allowed in the braced-init-list case (a[]{""}), and correctly disallowed in the parenthesized case (a[]("")). Giving the array extent (a[2] = "") does not appear to make any difference. It looks like the extent of the array is being taken from the length of the string literal (including terminator), with some amusing results: #include <string> #include <iostream> int main() { std::string a[] = "hello"; for (int i = 0; i < sizeof(a)/sizeof(a[0]); ++i) std::cout << a[i] << '\n'; } outputs: hello hello hello hello hello hello (6, count 'em). If an array extent is provided (e.g. std::string a[10] = "hello"), then the string literal will be used to initialize each element.