gpt4 book ai didi

c++ - "Move or throw"使用三元运算符

转载 作者:IT老高 更新时间:2023-10-28 22:22:19 24 4
gpt4 key购买 nike

自 C++11 以来,我一直在使用三元运算符根据某些条件移动或抛出,但最新的 GCC(9.1 和树干)不再工作。

我已将问题简化为这个例子(Wandbox permalink):

#include <iostream>
#include <memory>

int main()
{
auto p = std::make_unique<int>();
std::cout << "p.get(): " << p.get() << std::endl;

{
std::cout << "Move p into q" << std::endl;
auto q = p ? std::move(p) : throw std::invalid_argument{"null ptr"};

std::cout << "q.get(): " << q.get() << std::endl;
}

std::cout << "p.get(): " << p.get() << std::endl;
return 0;
}

它适用于 GCC 8.3 及更早版本,以及每个 Clang 版本;并且 p 被移动:

p.get(): 0xde5c20
Move p into q
q.get(): 0xde5c20
p.get(): 0

但现在使用 GCC 9.1 及更高版本它不起作用:

p.get(): 0x1d89150
Move p into q
q.get(): 0x1d89150
p.get(): 0x1d89150

然后程序由于双重释放而崩溃。

这是 GCC 9.1/trunk 中的错误吗?或者最新的 GCC 是唯一一个做正确事情的,这不是有效的 C++?

最佳答案

必须是一个错误。

移动将是一个移动,或者由于尝试复制 unique_ptr 导致编译失败(或发生 throw 在这种情况下无关紧要) .

q.get() == p.get() 确实表明内部已经发生故障,因为这是不可能的。

我同意 cpplearner 的观点,即 bug 90393 (及其所有骗子),据报道已在 GCC 9.1 中引入。

要么降级、等待升级,要么将您的代码改造成一个不错的 if/else。 😊

关于c++ - "Move or throw"使用三元运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56847546/

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