[Bug c++/60009] New: g++ allows copy-initialization of an array of class type from a non-braced string literal
ed at catmur dot co.uk
gcc-bugzilla@gcc.gnu.org
Fri Jan 31 14:52:00 GMT 2014
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.
More information about the Gcc-bugs
mailing list