The following code compiles with GCC 4.9.2 but not with Clang 3.5.0:
#include
class Foo
{
public:
explicit operator std::string() const;
};
This seems to be a Clang bug. [over.match.list]/1:
When objects of non-aggregate class type
T
are list-initialized (8.5.4), overload resolution selects the constructor in two phases:
- [..]
- If no viable initializer-list constructor is found, overload resolution is performed again, where the candidate functions are all the constructors of the class
T
and the argument list consists of the elements of the initializer list.
Since the second line compiles fine, there is an inconsistency: They should be equivalent when it comes to overload resolution.
From [class.conv.fct]/2:
A conversion function may be explicit (7.1.2), in which case it is only considered as a user-defined conversion for direct-initialization (8.5).
So the question is how you initialize your objects. Clearly baz
is direct-initialized, so this works. By contrast, bar
is direct-list-initialized, but not direct-initialized, and so the explicit conversion is not available.
clang doesn't seem to care whether the conversion operator is explicit
or not, and I believe it is correct due to the wording in [over.best.ics].
First of all, the direct-initialization
std::string baz(Foo{});
works on both gcc and clang, and is explained by [class.conv.fct]/2 as mentioned in KerrekSB's answer.
The direct-list-initialization
std::string bar{Foo{}};
on the other hand, does not consider any user defined conversions, explicit
or not.
Quoting N3337, §13.3.3.1/4 [over.best.ics]
However, when considering the argument of a constructor or user-defined conversion function that is a candidate by 13.3.1.3 when invoked for the copying/moving of the temporary in the second step of a class copy-initialization, by 13.3.1.7 when passing the initializer list as a single argument or when the initializer list has exactly one element and a conversion to some class X or reference to (possibly cv-qualified) X is considered for the first parameter of a constructor of X, or by 13.3.1.4, 13.3.1.5, or 13.3.1.6 in all cases, only standard conversion sequences and ellipsis conversion sequences are considered.