相关疑难解决方法(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中模拟移动语义的方法有多安全?

使用这个答案,我发明了自己的基于C++ 03模拟移动语义的方法swap.

首先,我检测移动语义(即C++ 03的可用性):

#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) ||  \
    defined(_MSC_VER) && _MSC_VER >= 1600
#define HAS_MOVE_SEMANTICS 1
#elif defined(__clang)
#if __has_feature(cxx_rvalue_references)
#define HAS_MOVE_SEMANTICS 1
#else
#define HAS_MOVE_SEMANTICS 0
#endif
#else
#define HAS_MOVE_SEMANTICS 0
#endif
Run Code Online (Sandbox Code Playgroud)

然后我有条件地定义一个名为的宏move:

#if !HAS_MOVE_SEMANTICS
#include <algorithm>
namespace _cpp11_detail
{
    template<bool B, class T = void> struct enable_if;
    template<class T> struct enable_if<false, T> { };
    template<class T> struct enable_if<true, T> { typedef T type; };
    template<class T>
    inline char …
Run Code Online (Sandbox Code Playgroud)

c++ move-semantics c++11 c++03

9
推荐指数
1
解决办法
747
查看次数

是否可以通过const引用获取参数,同时禁止转换以便不传递临时值?

有时我们喜欢通过引用获取一个大参数,并且如果可能的话也使参考const宣称它是一个输入参数.但是通过制作引用const,编译器然后允许自己转换数据,如果它是错误的类型.这意味着它不那么有效,但更令人担心的是我认为我指的是原始数据; 也许我会接受它的地址,而不是意识到我实际上是在接受一个临时的地址.

bar此代码中的调用失败.这是可取的,因为引用的类型不正确.调用bar_const也是错误的类型,但它默默地编译.这对我来说是不受欢迎的.

#include<vector>
using namespace std;

int vi;

void foo(int &) { }
void bar(long &) { }
void bar_const(const long &) { }

int main() {
   foo(vi);
   // bar(vi); // compiler error, as expected/desired
   bar_const(vi);
}
Run Code Online (Sandbox Code Playgroud)

传递轻量级只读引用最安全的方法是什么?我很想创建一个类似于参考的新模板.

(显然,int并且long是非常小的类型.但是我已经遇到了可以相互转换的更大的结构.当我采用const引用时,我不希望这种情况无声地发生.有时,将构造函数标记为明确的帮助,但这并不理想)

更新:我想象一个如下系统:想象一下有两个函数X byVal();X& byRef();下面的代码块:

 X x;
 const_lvalue_ref<X> a = x; // I want this to compile
 const_lvalue_ref<X> b = byVal(); // I want this to fail at compile time …
Run Code Online (Sandbox Code Playgroud)

c++ const

5
推荐指数
2
解决办法
636
查看次数

R ++中的Rvalues 03

如何判断给定参数是否是C++ 03中的右值?我正在编写一些非常通用的代码,如果可能的话我需要参考,否则就构建一个新的对象.我可以重载以获取by-value和by-reference并让rvalue返回调用by-value函数吗?

或者我有一种非常令人作呕的感觉,这就是为什么右值引用在C++ 0x中?

编辑:

is_rvalue =!(is_reference || is_pointer)?

c++ templates rvalue lvalue c++03

4
推荐指数
1
解决办法
696
查看次数

标签 统计

c++ ×4

c++03 ×2

c++11 ×2

coding-style ×1

const ×1

lvalue ×1

move-semantics ×1

rvalue ×1

templates ×1