This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/60009] New: g++ allows copy-initialization of an array of class type from a non-braced string literal
- From: "ed at catmur dot co.uk" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 31 Jan 2014 14:52:54 +0000
- Subject: [Bug c++/60009] New: g++ allows copy-initialization of an array of class type from a non-braced string literal
- Auto-submitted: auto-generated
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.