什么是 <<= 运算符 C++
What is <<= operator in C++
我在遗留系统中发现了以下代码。因为它似乎是"分配和左移",但我看到这段代码正在将字符串复制到 ws,但我不明白如何?我想知道简单的赋值是否足以将一个字符串复制到另一个字符串,那么为什么有人会这样编码?
vector<string> unique_dirs;
......
......
......
std::wstring ws;
ws <<= unique_dirs[i];
编辑 - 我查看了类实现(c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xstring)。类中没有这样的运算符"<<="重载。
没有这样的标准重载运算符,其左操作数是 std::wstring,右操作数是 std::string。您应该调查遇到此运算符的代码以查找其定义。
默认情况下:
ws <<= unique_dirs[i]
与 相同:
ws = ws << unique_dirs[i]
它只是按位左移分配。但在这种情况下,它应该重载以处理字符串。
尽管我评论说调查代码比人们猜测正在发生的事情更容易,但这是我对可能的实现的猜测,因为您想知道如何完成它 - 这可能出现在代码中的任何位置,几乎,只要可以看到它被调用的位置,因为它没有修改任何标准库类:
std::wstring& operator<<=(std::wstring& out, const std::string& in) {
out += std::wstring(in.begin(), in.end());
return out;
}
我的猜测是,当string
被传递给wstring
时,运算符正在执行某种"加宽"(从char
到wchar
的穷人转换,不考虑编码)。
为什么你想要这个而不是使用直接作业? 好吧,除了ws = unique_dirs[i];
是一个编译错误之外,它还可以为您提供一种连接字符串的方法:
std::string hello("hello ");
std::string goodbye("goodbye");
std::wstring ws;
ws <<= hello;
ws <<= goodbye;
// ws now is L"hello goodbye"
顺便说一句,上面没有修改标准库 - 它没有扩展std::basic_string
类,它只是提供了一个将两个类作为参数的运算符。 所以我不确定它在使用方面是如何属于"合法性"的。 然而,这是相当可怕的,它的使用在道德上是应受谴责的。
除非 <<= 重载,否则它是按位左移运算符。
ws <<= unique_dirs[i]方法ws = ws <<unique_dirs[i]
尽管我怀疑代码如何为此目的使用向量中的某些字符串元素背后的逻辑。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 如何显式调用运算符<<
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 左角支架解释为操作员&lt;而不是模板参数
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- 超载操作员&lt;&lt; - 必须是二进制操作员
- 没有匹配的“运营商&lt;&lt;”