g++ L "string~" + 运算符,如 Visual C++

g++ L"string~" + operator like Visual C++

本文关键字:Visual 运算符 C++ string g++      更新时间:2023-10-16

在Visual C++中,

CString a = L"Hello " + L"World!";

CString a = L"" + 123;

可以做到,对吧?

L"~"是wchar*类型,但它怎么能做到呢?

它只对Visual C++有效吗?我的意思是,Visual C++的编译器级别支持它吗?g++做不到?

或者我可以重载原始(全局)运算符,比如吗

wchar_t* operator+(wchar_t* L, wchar_t* R){...}

您的第一个示例(L"Hello " + L"World!")不能按原样执行。它需要添加字符串文字(或指针,它们可以转换为这些文字),这是不允许的。

一种替代方案是不使用+,而是依赖于字符串串联:

CString a = L"Hello" L"World!";

[在编译时,如果有两个字符串文字,但它们之间没有任何内容,编译器会将两者连接成一个字符串文字。不过,这只适用于文字——类似于字符串对象+文字需要运算符。]

另一种可能性(假设您使用的是足够新的VC++版本)是定义一个用户定义的文字运算符,创建类型为CString的文字,在这种情况下,您将使用现有的operator+作为CString。

CString operator""_cs(TCHAR const *in) { return CString(in); }
// ...
CString a = L"hello"_cs + L"World!"_cs;

至于第二个例子(a = L"" + 123;),这个语法已经被允许了——添加一个指针和一个整数会产生一个增加了该整数的指针,所以(例如)L"012345" + 2会给L"012345"中的2一个指针。

因此,您可以使用现有的功能,但不能使用运算符重载来更改它的作用。

如果您的意图是将123转换为字符串,则可以(例如)使用std::to_string(123)(但这会产生类型为std::string而不是CString的结果)。

运算符重载的基本规则通常是,至少有一个操作数必须是用户定义的类型(或对用户定义类型的引用)。如果两个操作数都是内置类型,那么这是不允许的。

只要编译器足够新,前面的所有内容都是可移植的(但用户定义的文字是在C++11中添加的,所以旧的编译器不包括它们)。VC++包含一个名为CString的类作为其MFC库的一部分。gcc不包括这一点,但如果需要,可以为它编写类似的类。