gpt4 book ai didi

c++ - const_cast 和 std::move 从非引用中删除常量

转载 作者:IT老高 更新时间:2023-10-28 21:53:15 28 4
gpt4 key购买 nike

我有一个无法修改的外部库。该库声明了一个模板函数,由于某种原因返回 const非引用对象:

template<class C>
const C foo();

我还有另一个无法修改的外部库。该库声明了一个不可复制的类,并且仅具有来自非常量对象的 move 构造函数:

struct bar {
bar();
bar(const bar&)=delete;
bar(bar&&);
};

现在我需要使用 foo<bar> .一个简单的用法:

bar buz() {
return foo<bar>();
}

失败

main.cpp: In function 'bar buz()':
main.cpp:13:21: error: use of deleted function 'bar::bar(const bar&)'
return foo<bar>();
^
main.cpp:8:5: note: declared here
bar(const bar&)=delete;
^~~

这是有道理的,没有简单的解决方法可以编译代码。

但是,如果我添加一些更复杂的解决方法:

bar buz() {
return const_cast<bar&&>(std::move(foo<bar>()));
}

它编译并且整个代码按预期工作(不仅是上面的简化示例,还有我的真实代码)。

但是,它是安全的,还是我遇到了一些未定义的行为?有没有更好的解决方法?


我已阅读并了解有关返回 const 的问题来自函数( 12 ),常见的答案似乎是返回 const在现代 C++ 中不鼓励使用 objects,但我的问题不是关于它,而是关于当外部库返回 const 时如何解决这种情况对象。

最佳答案

如果 bar 的 move 构造函数修改了任何内容,则丢弃 const 将导致未定义的行为。您可能可以像这样解决您的问题,而不会引入未定义的行为:

struct wrapped_bar {
mutable bar wrapped;
};

bar buz()
{
return foo<wrapped_bar>().wrapped;
}

wrapped 成员是可变的意味着该成员是非常量的,即使 wrapped_bar 对象作为一个整体是 const。根据 foo() 的工作原理,您可能需要将成员添加到 wrapped_bar 以使其更像 bar 工作。

关于c++ - const_cast 和 std::move 从非引用中删除常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37418387/

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