-1

我在遗留系统中发现了以下代码。因为它似乎是“分配和左移”,但我看到这段代码正在将字符串复制到 ws 但我不明白怎么做?我想知道简单的分配是否足以将一个字符串复制到另一个字符串,那么为什么有人会这样编码?

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

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

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

4

4 回答 4

3

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

于 2013-11-06T12:34:13.687 回答
2

默认 :

ws <<= unique_dirs[i]

是相同的 :

ws = ws << unique_dirs[i]

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

于 2013-11-06T12:19:58.420 回答
1

尽管我评论说调查代码比人们猜测发生的事情要容易,但这是我对可能实现的猜测,因为您想知道是如何完成的——这几乎可以出现在代码中的任何地方,只要它可以可以看到它被调用的位置,因为它没有修改任何标准库类:

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

我的猜测是,当 astring被传递给 awstring时,操作员正在执行某种“扩展”(从charto的穷人转换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类,它只是提供一个将两个类作为参数的运算符。所以我不确定它在使用方面是如何归于“合法性”的。然而,这是相当可怕的,它的使用在道德上是应受谴责的。

于 2013-11-06T13:34:07.390 回答
0

除非 <<= 被重载,否则它是按位左移运算符。

ws <<= unique_dirs[i] 表示 ws = ws << unique_dirs[i]

尽管我对代码如何为此目的使用向量中的某些字符串元素背后的逻辑持怀疑态度。

于 2013-11-06T12:26:00.220 回答