This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c++/60009] New: g++ allows copy-initialization of an array of class type from a non-braced string literal


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.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]