У меня есть этот код:
class MyString
{
public:
operator const char*() const {
return nullptr;
}
};
class YourString
{
public:
YourString() {}
YourString(const char* ptr) {
(void)ptr;
}
YourString& operator=(const char* ptr)
{
return *this;
}
};
int main()
{
MyString mys;
YourString yoursWorks;
yoursWorks = mys;
YourString yoursAlsoWorks(mys);
YourString yoursBreaks = mys;
}
MSVC принимает его без проблем. Clang-CL не принимает его:
$ "C:\Program Files\LLVM\msbuild-bin\CL.exe" ..\string_conversion.cpp
..\string_conversion.cpp(32,13): error: no viable conversion from 'MyString' to 'YourString'
YourString yoursBreaks = mys;
^ ~~~
..\string_conversion.cpp(10,7): note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'MyString' to
'const YourString &' for 1st argument
class YourString
^
..\string_conversion.cpp(10,7): note: candidate constructor (the implicit move constructor) not viable: no known conversion from 'MyString' to
'YourString &&' for 1st argument
class YourString
^
..\string_conversion.cpp(14,2): note: candidate constructor not viable: no known conversion from 'MyString' to 'const char *' for 1st argument
YourString(const char* ptr) {
^
..\string_conversion.cpp(5,2): note: candidate function
operator const char*() const {
^
1 error generated.
Не делает GCC:
$ g++.exe -std=gnu++14 ..\string_conversion.cpp
..\string_conversion.cpp: In function 'int main()':
..\string_conversion.cpp:33:27: error: conversion from 'MyString' to non-scalar type 'YourString' requested
YourString yoursBreaks = mys;
^
Я понимаю, что разрешено только одно пользовательское преобразование.
Однако, MSVC оправдан при обработке строки
YourString yoursBreaks = mys;
как
YourString yoursBreaks(mys);
и принять его? Это разрешено делать компиляторам преобразования? По каким правилам это разрешено/запрещено? Есть ли подобное правило?
Обновление: при использовании MSVC флаг /Za
заставляет код не принимать.
$ "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\x86_amd64\CL.exe" /Za ..\string_conversion.cpp
string_conversion.cpp
..\string_conversion.cpp(33): error C2440: 'initializing': cannot convert from 'MyString' to 'YourString'
..\string_conversion.cpp(33): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called