Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ no'的解决办法;右值引用*此';特征_C++_C++11_Move Semantics_Rvalue Reference - Fatal编程技术网

C++ no'的解决办法;右值引用*此';特征

C++ no'的解决办法;右值引用*此';特征,c++,c++11,move-semantics,rvalue-reference,C++,C++11,Move Semantics,Rvalue Reference,我在一个可移动对象周围有一个代理容器类,希望代理能够隐式地生成对底层对象的右值引用,但仅当代理本身正在移动时 我相信,我将能够按照提案n2439实现此行为,但它尚未在gcc版本中提供,并且在一段时间内不会提供 下面的代码是我最终的目标,但目前还不可能。在我可以使用此功能之前,是否有任何等效的解决方法 template< class T > struct movable_proxy { operator T&&() && { re

我在一个可移动对象周围有一个代理容器类,希望代理能够隐式地生成对底层对象的右值引用,但仅当代理本身正在移动时

我相信,我将能够按照提案n2439实现此行为,但它尚未在gcc版本中提供,并且在一段时间内不会提供

下面的代码是我最终的目标,但目前还不可能。在我可以使用此功能之前,是否有任何等效的解决方法

template< class T >
struct movable_proxy {
    operator T&&() && {
        return std::move(value);
    }

    operator const T&() const& {
        return value;
    }

private:
    T value;
};
模板
结构可移动代理{
运算符T&&()&&{
返回std::move(值);
}
运算符常量T&()常量{
返回值;
}
私人:
T值;
};

问得好。最近我尝试编写一个类似的代理类,但从未得到一个好的解决方案。我发现最好的方法是在代理必须是r值的每次使用中调用成员函数:

ORef<T> move() {
    return ORef<T>( this->release() );
}
ORef move(){
返回ORef(此->发布());
}
这会将声明某个对象为r值的语义从
std::move(proxy)
更改为
proxy.move()
,但也允许返回不同类型的对象(隐式转换为所需类型)


我使用这种方法的编码实践是始终将代理对象作为右值传递,这会强制手动指定语义(移动、共享引用、复制或其他),但这当然会使使用错误成为一个潜在问题(例如,在最终使用
x
之前调用
x.move().

我认为你能得到的最接近的函数是一个显式进行转换的函数,而不是一个转换运算符,因此你必须说
convert\u proxy(p)
,它重载了右值和左值,以返回
T&
const T&
。。。但这使得代理的使用变得不透明,这可能不是你想知道的。对不起,我不理解,但我想得到它。如果你删除了新提出的
&&
&
修饰符,你到底缺少了什么?记录在案,.不知情者无耻的插件:@Omnifarious,仅仅因为它还没有实现。它是缺少的最后一个核心语言功能,但对它的需求(或IMHO需求)远远少于lambdas、rvalue引用等。它将出现在GCC 4.9中,甚至可能出现在某些
x>0
中的4.8.x中,谢谢@dhardy;我最终得到了完全相同的代理类型,一个“release”调用和您提到的相同的使用错误。遗憾的是,似乎没有一个解决办法,但我想这确实使所需的语言扩展成为一个很好的例子。