Open steveire opened 5 years ago
This doesn't affect all UDLs; only 'u8' UDLs are a problem. This is happening because u8 character and string literals changed type (from char to char8_t) in C++20, and we don't yet know what mangling MS is going to give the type char8_t.
Extended Description
This occurs while trying to implement a user-defined literal. Attempting to compile code without char8_t and with
A a2 = u8"\u4F60\u597D"_sv;
results in
u8.cpp(24,28): error: no matching literal operator for call to 'operator""_sv' with arguments of types 'const char8_t *' and 'unsigned long long', and no matching literal operator template A a2 = u8"\u4F60\u597D"_sv;
Trying to add an overload with char8_t results in:
u8.cpp(10,1): error: cannot mangle this built-in char8_t type yet A operator "" _sv(const char8_t* str, INT len) ^
~~~~~~~~~1 error generated.So, currently UDL can't be used with /std:c++latest
struct A { A() {} };
define INT unsigned long long
ifdef TRY_U8
A operator "" _sv(const char8_t* str, INT len) { return A{}; }
endif
A operator "" _sv(const char* str, INT len) { return A{}; }
int main() { A a1 = "hello"_sv;
ifdef TRY_U8
endif
}