c++ const_cast和std :: move去除非引用的constness

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

template<class C>
const C foo();

我有另一个外部库,我也不能修改。该库声明一个不可复制的类,并且仅具有来自非const对象的移动构造函数:

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

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

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

失败了

06003

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

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

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

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

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

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

从技术上讲,你将程序暴露于未定义的行为。由于原始对象C(一个临时的)被声明为const,常量和修改它是非法的,违反了标准。 (我假设移动构造函数对movee做了一些修改)。

话虽如此,它可能在您的环境中工作,我看不到更好的解决方法。

翻译自:https://stackoverflow.com/questions/37418387/const-cast-and-stdmove-to-remove-constness-from-non-reference

转载注明原文:c++ const_cast和std :: move去除非引用的constness