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
Tare 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
Tand 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.