gpt4 book ai didi

c++ - 关于此运算符重载的意见

转载 作者:太空宇宙 更新时间:2023-11-04 16:19:16 24 4
gpt4 key购买 nike

这更像是征求意见,而不是我在代码库中遇到的具体困难。举个简单的例子:-

class Ref
{
public:
Ref(char* s, size_t l) : _s(s), _l(l) {}
private:
char* _s;
size_t _l;
};

std::stringstream ss;

char a[256];
ss >> Ref(a, sizeof(a)); // <-------- here is the discussion line

friend std::stringstream& operator>>(std::stringstream& ss, Ref& r)
{
// perform some functionality
}

现在,当使用 Visual Studio 时,上面的代码编译得很好......似乎发现当我使用运算符 >> 时,因为我有一个采用引用的覆盖,我的意思是将创建的对象作为引用传递.然而,当使用 gcc 时,它会抛出一个不稳定的问题。它提示说我的操作没有运算符过载。

从技术上讲,我认为 gcc 是正确的,因为我正在创建对象并将对象传递给运算符而不是对象的引用。我只是想知道为什么 Microsoft 编译器会允许这样做,或者为什么 gcc 无法弄清楚我打算通过引用传递它?在上述情况下,Ref 对象相当微不足道,通过引用传递或对象本身无关紧要,但如果 R​​ef 更复杂、更重,那么它可能最终会成为一个问题。

因此,我正在询问人们对上述内容的看法...并提供一些建议。显然,您可以构造 Ref 并通过引用传递,或者更改运算符重载以获取对象而不是引用,但实际上更多的是关于 Visual Studio 和 gcc 之间的差异以及您的意见。

最佳答案

gcc 是正确的,你需要 const Ref& r 来编译它。Ref(a, sizeof(a)) 创建一个临时对象,它只能绑定(bind)到常量左值引用。Microsoft 编译代码的原因是由于其不符合要求的邪恶扩展,该扩展允许非常量左值引用绑定(bind)到临时对象。使用 /W4 编译以获得有关它的警告。

关于c++ - 关于此运算符重载的意见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19092860/

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