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

时间:2015-04-18 16:09:16

标签: c++ string visual-c++ g++ operator-overloading

在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){...}

1 个答案:

答案 0 :(得分:2)

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

另一种方法是将+退出,并依赖字符串连接:

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

[在编译时,如果你有两个字符串文字,它们之间没有任何内容,编译器会将两者连接成一个字符串文字。这仅适用于文字 - 类似于字符串对象+文字需要操作符。]

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

CString operator""_cs(TCHAR const *in) { return CString(in); }

// ...

CString a = L"hello"_cs + L"World!"_cs;

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

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

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

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

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