相关疑难解决方法(0)

在C++ 11中,pass-by-value是一个合理的默认值吗?

在传统的C++中,将值传递给函数和方法对于大型对象来说是很慢的,并且通常不赞成.相反,C++程序员倾向于传递引用,这更快,但它引入了围绕所有权的各种复杂问题,特别是围绕内存管理(如果对象是堆分配的)

现在,在C++ 11中,我们有Rvalue引用和移动构造函数,这意味着可以实现一个大的对象(比如一个std::vector),它可以通过值传入和传出函数.

那么,这是否意味着默认值应该是传递类型实例的值,例如std::vectorstd::string?自定义对象怎么样?什么是新的最佳做法?

c++ coding-style c++11

137
推荐指数
3
解决办法
2万
查看次数

C++ 03.在编译时测试rvalue-vs-lvalue,而不仅仅是在运行时

在C++ 03中,Boost的Foreach使用这种有趣的技术,可以在运行时检测表达式是左值还是左值.(我发现通过这个StackOverflow问题:C++ 03中的Rvalues)

这是一个在运行时工作演示

(这是一个更基本的问题,当我在思考我最近的另一个问题时出现.对此的答案可能有助于我们回答另一个问题.)

现在我已经详细说明了这个问题,在编译时在C++ 03中测试rvalue-ness,我会谈谈到目前为止我一直在尝试的事情.

我希望能够在编译时进行此检查.在C++ 11中很容易,但我对C++ 03很好奇.

我正在努力建立他们的想法,但也会对不同的方法持开放态度.他们的技术的基本思想是将此代码放入一个宏:

true ? rvalue_probe() : EXPRESSION;
Run Code Online (Sandbox Code Playgroud)

它的左侧是'true' ?,因此我们可以确定永远不会评估EXPRESSION.但有趣的是,?:运算符的行为会有所不同,具体取决于它的参数是左值还是右值(单击上面的链接获取详细信息).特别是,它将rvalue_probe以两种方式之一转换我们的对象,具体取决于EXPRESSION是否为左值:

struct rvalue_probe
{
    template< class R > operator       R () { throw "rvalue"; }
    template< class L > operator       L & () const { throw "lvalue"; }
    template< class L > operator const L & () const { throw "const lvalue"; }
};
Run Code Online (Sandbox Code Playgroud)

这在运行时有效,因为可以捕获抛出的文本并用于分析EXPRESSION是左值还是右值.但我希望在编译时能够识别正在使用的转换. …

c++ rvalue language-lawyer c++03

22
推荐指数
1
解决办法
1797
查看次数

标签 统计

c++ ×2

c++03 ×1

c++11 ×1

coding-style ×1

language-lawyer ×1

rvalue ×1