Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++11 initializer_list constructor marked "explicit"

Can I use explicit with an init-list ctor to make sure an expression like {a} doesn't result in unexpected implicit conversion? And another thought: should I be worried about it? Writing {a} is less likely to be a mistake than simply a, but on the other hand, it still may not be clear from the code that we're constructing an object through implicit conversion.

class Foo
{
    explicit Foo (std::initializer_list<Bar> ilist) { /*...*/}
};
like image 407
cfa45ca55111016ee9269f0a52e771 Avatar asked Feb 11 '13 03:02

cfa45ca55111016ee9269f0a52e771


1 Answers

You cannot. It does result in the unexpected implicit conversion.

However, the unexpected implicit conversion is disallowed and the compiler will reject your program. That however doesn't stop the compiler to select or consider it. Example

 void f(Foo);
 void f(std::vector<Bar>);

 int main() {
   // ambiguous
   f({bar1, bar2, bar3});
 }
like image 117
Johannes Schaub - litb Avatar answered Oct 21 '22 16:10

Johannes Schaub - litb