一个移动语义对象的使用

3

我想调用一个构造stringstream对象的函数,如果满足某些条件,则使stringstream对象失效。但我尝试这样做时,会收到使用已移动的对象的警告。如何在不切换到string的情况下防止这种情况发生?

#include <iostream>
#include <sstream>
#include <functional>

using namespace std;

bool Condition(string) { return true; }

stringstream someFunc(function<bool(string&)> Condition) {
    stringstream ssRes; // Warning C26800 Use of a moved from object:'ssRes'

    ssRes << "here is a string";

    string str = ssRes.str();
    if (!Condition(str)) { ssRes.setstate(ios_base::failbit); }
    return ssRes;
}

int main() {
    stringstream ss = someFunc(Condition);
    return 0;
}

5
我们能否获得一个[MRE],以便我们可以尝试自己编译代码? - NathanOliver
请不要发布 ...。这样做只会让我们填写一些神奇地工作并且没有警告的代码,而你的真实代码无法编译。然后评论区就会充满“无法复制”的评论。所有编译器错误都可以使用实际编译的虚拟代码进行复制。例如,我们真的需要看到 setstate 吗? - PaulMcKenzie
你使用的编译器和编译设置是什么?我无法复现。 - NathanOliver
看起来是误报。ssRes在函数结束之前没有被移动,所以没问题。 - NathanOliver
3
一个 [mre] 似乎应该是 https://godbolt.org/z/cPxYd9Gb9,并且应该被报告给 Microsoft 作为一个 bug。 - Alan Birtles
显示剩余5条评论
1个回答

0

这是一个已在Visual Studio 2022版本17.3中修复的错误

如果无法更新VS,您可以使用#pragma warning(suppress: 26800)暂时禁用此警告。

#include <iostream>
#include <sstream>
#include <functional>

using namespace std;

bool Condition(string) { return true; }

stringstream someFunc(function<bool(string&)> Condition) {
    stringstream ssRes; // Warning C26800 Use of a moved from object:'ssRes'

    ssRes << "here is a string";

    string str = ssRes.str();
    if (!Condition(str)) { ssRes.setstate(ios_base::failbit); }
#pragma warning(suppress: 26800)
    return ssRes;
}

int main() {
    stringstream ss = someFunc(Condition);
    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接