gpt4 book ai didi

c++ - 关于将 string::swap() 与临时对象一起使用的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:01 25 4
gpt4 key购买 nike

以下部分演示了我的问题:(GCC 上的编译错误)

stringstream ss;
string s;
ss << "Hello";

// This fails:
// s.swap(ss.str());

// This works:
ss.str().swap(s);

我的错误:

constSwap.cc:14: error: no matching function for call to 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >::swap(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
basic_string.tcc:496: note: candidates are: void std::basic_string<_CharT, _Traits, _Alloc>::swap(std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]

虽然我知道 stringstream 中的 str() 会返回一个临时值,但它没有意义,而且不是很明显我应该用局部变量作为参数而不是我的第一直觉来调用临时值上的交换。

显然直接赋值效果更好,较新的 C++ 标准具有完美的移动语义,但这些不适用于我的实现。

Visual Studio 不会给出这个问题,因为它对 C++ 标准放宽了要求。我有点已经理解了对临时事物的整个 const 引用(我认为这是我编译错误的原因)。

我的问题:任何人都可以向我解释这是否是唯一的解决方案,也许可以向我解释将来如何考虑这个问题,以便我可以发现并解决类似的问题?

(如果没有人有任何很好的见解,我至少会在这里发布给有类似问题的人)

最佳答案

您不能将临时变量绑定(bind)到非常量引用。由于这个原因,从 ss.str() 返回的临时值不能传递给 std::string::swap ,它希望修改它的参数(因此它需要它的使用 non-const& 的参数。

第二个版本在您调用允许的临时对象上的成员函数时工作。

但是你为什么要首先交换呢?通常,一个简单的:

std::string s(ss.str());

应该够好了。这并不比交换效率低(至少在具有移动语义的 C++0x 中),但同时可读性更高。

关于c++ - 关于将 string::swap() 与临时对象一起使用的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3232582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com