【发布时间】:2019-09-20 23:17:44
【问题描述】:
我正在编写一个转换运算符,用于将类转换为左值或右值。所以我假设:
struct C
{
int x;
template<typename T>
operator T&&() {
return std::forward<T>(x);
}
};
int main() {
C x;
int&& rv_i = std::move(x);
int rv_i2 = x;
//int& rv_i3 = x; // fails
}
会同时添加两者。我很惊讶它只添加了一个转换运算符,该运算符转换为T 类型的右值。这是标准故意的还是 g++、clang++ 和 VC++ 中的错误?
因此,它再次需要复制更多功能。 :(
【问题讨论】:
-
FWIW,
std::move总是会给你一个右值,std::forward会有条件地给你一个。你有没有这些还不够的用例? -
甚至无法编译。
-
将运算符转换为 ref 不是直接上下文,因此很遗憾它不是转发引用。该区域在标准中也不清楚。 I've been bitten by that recently.
-
@Swordfish,对不起。错字。为更完整的示例添加了附加代码。
-
@GuillaumeRacicot,您所说的“不在直接上下文中”是什么意思?
标签: c++ c++11 language-lawyer