什么是<< = C ++中的运算符

时间:2013-11-06 12:17:01

标签: c++ windows

我在遗留系统中发现了以下代码。因为它似乎是“分配和左移”但我看到这段代码是将字符串复制到ws但我无法理解如何?我想知道简单的赋值是否足以将一个字符串复制到另一个字符串然后为什么有人会像这样编码?

vector<string> unique_dirs; 
......
......
......

std::wstring ws;
ws <<= unique_dirs[i];

编辑 - 我查看了类实现(c:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ include \ xstring)。在课堂上没有这样的运算符“&lt;&lt; =”重载。

4 个答案:

答案 0 :(得分:3)

没有这样的标准重载运算符,其左操作数是std :: wstring,右操作数是std :: string。您应该调查遇到此运算符的代码,以查找其定义。

答案 1 :(得分:2)

默认情况下:

ws <<= unique_dirs[i]

与:

相同
ws = ws << unique_dirs[i]

这只是Bitwise左移位分配。 但在这种情况下,它应该被重载以使用字符串。

答案 2 :(得分:1)

尽管我的评论是调查代码比人们猜测发生了什么更容易,但我猜这是一个可能的实现,因为你想知道如何它可以做到 - 这可能出现在任何地方在代码中,几乎可以看到它被调用的地方,因为它没有修改任何标准库类:

std::wstring& operator<<=(std::wstring& out, const std::string& in) {
    out += std::wstring(in.begin(), in.end());
    return out;
}

我的猜测在这里,当string传递给wstring时,运营商正在执行某种“拓宽”(从charwchar,无视编码。)

为什么你想要这个而不是直接分配?好吧,除了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类,它只是提供一个运算符,它将两个类作为参数。所以我不确定它在使用方面是否属于“合法性”。然而,这是相当可怕的,它的使用在道德上是应该受到谴责的。

答案 3 :(得分:0)

除非&lt;&lt; =重载,否则它是按位左移运算符。

ws&lt;&lt; = unique_dirs [i] 手段 ws = ws&lt;&lt; unique_dirs [I]

虽然我怀疑代码如何在向量中使用某个字符串元素来实现此目的。