我有一个外部库,无法修改。该库声明了一个模板函数,由于某些原因返回非引用的const
对象:
template<class C>
const C foo();
我有另一个无法修改的外部库。该库声明了一个不可复制的类,并仅从非const对象拥有移动构造函数:
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
的问题(1, 2),那里的常见答案似乎是在现代C++中不鼓励返回const
对象,但我的问题不是这个,而是当外部库返回const
对象时如何解决此问题。
const_cast<bar>(foo<bar>())
不够吗? 这仍然会在返回语句中留下未命名对象,因此移动语义应该会启动。 - Hcorg错误:使用const_cast处理类型为“bar”的非指针、引用或数据成员指针类型无效
。 - Petrconst_cast<bar&&>
而不使用std::move
,这样可以更简单。此外-您确定foo内部没有任何特定的内容使得“const”是合理的吗? - Hcorg