Friday, 31 March 2017

c++ - 'explicit' keyword in g++ has no effect for simple constructor (not copy/assignment constructor)?




Can anyone explain why the following code compiles? I expect it to get an error where the double constant 3.3 can not be converted to int, since I declare the constructor to be explicit.



class A
{

public:
int n;
explicit A(int _n);
};

A::A(int _n)
{
n = _n;
}


int main()
{
A a(3.3); // <== I expect this line to get an error.
return 0;
}

Answer




explicit class_name ( params ) (1)
explicit operator type ( ) (since C++11) (2)




1) specifies that this constructor is only considered for direct initialization (including explicit conversions)



2) specifies that this user-defined conversion function is only considered for direct initialization (including explicit conversions)




In your case you are using direct initialization to construct an instance of type A by doing this:



A a(3.3);



The explicit keyword does not stop the compiler from implicitly casting your argument from a double type to an int. It stops you from doing something like this:



A a = 33;

No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...