g++ L "string~" + 运算符,如 Visual C++
g++ L"string~" + operator like Visual C++
在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不包括这一点,但如果需要,可以为它编写类似的类。
- 为什么我不能使用在 Visual C++ 32 位中实现运算符无符号 int() 作为数组索引的类?
- Visual Studio 15:重载"<<" C++中的插入运算符
- 特定运算符为 Visual Studio Community 2017 C++着色
- C++中动态分配的单向链表的赋值运算符 (MS Visual Studio 2015)
- Visual studio:E0349 没有运算符<<匹配这些操作数(但代码中没有字符串)
- 当使用三元运算符并删除移动/复制CTOR时,Visual Studio不执行RVO
- 没有运算符<<与这些操作数匹配 Visual C++
- C++ 调试在Visual Studio中找不到'='运算符
- Visual Studio 运算符 += 不明确
- 无法在 Visual Studio 2013 中运行非常基本的代码 - 运算符">>"错误/生成错误
- Visual Studio无法在布尔运算的上下文中实例化强制转换运算符模板(T=bool)
- 如何解决Visual Studio 2012不支持显式转换运算符的问题
- g++ L "string~" + 运算符,如 Visual C++
- visual C++:简单的运算符优先级问题或其他问题
- visual C++重载运算符double*Vec
- 在 Visual Studio 10 中使用类型转换运算符重载时出现 C2440 错误
- Visual Studio 2013 - 自动插入"->"运算符
- Visual c++2012:为什么priority_queue需要重载赋值运算符
- 重载的强制转换运算符继承(Visual C++)
- Visual Studio 2008 运行时堆栈溢出警告,当运算符在所有路径上<递归时警告