Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does the equal sign make a difference in brace initialization? eg. 'T a = {}' vs 'T a{}'

Here are two ways to initialize a variable in C++11:

T a {something}; T a = {something}; 

I tested these two in all scenarios I could think of and I failed to notice a difference. This answer suggests that there is a subtle difference between the two:

For variables I don't pay much attention between the T t = { init }; or T t { init }; styles, I find the difference to be minor and will at worst only result in a helpful compiler message about misusing an explicit constructor.

So, is there any difference between the two?

like image 999
Nikita Avatar asked Dec 22 '13 19:12

Nikita


1 Answers

The only significant difference I know is in the treatment of explicit constructors:

struct foo {     explicit foo(int); };  foo f0 {42};    // OK foo f1 = {42};  // not allowed 

This is similar to the "traditional" initialization:

foo f0 (42);  // OK foo f1 = 42;  // not allowed 

See [over.match.list]/1.


Apart from that, there's a defect (see CWG 1270) in C++11 that allows brace-elision only for the form T a = {something}

struct aggr {     int arr[5]; };  aggr a0 = {1,2,3,4,5};  // OK aggr a1 {1,2,3,4,5};    // not allowed 
like image 165
dyp Avatar answered Oct 14 '22 23:10

dyp