相关疑难解决方法(0)

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

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

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

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

c++ coding-style c++11

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

是否允许`std :: function`移动其参数?

在处理这个问题的过程中,我注意到GCC(v4.7)的实现std::function在它们被值出现时会移动它的论点.以下代码显示了此行为:

#include <functional>
#include <iostream>

struct CopyableMovable
{
    CopyableMovable()                        { std::cout << "default" << '\n'; }
    CopyableMovable(CopyableMovable const &) { std::cout << "copy" << '\n'; }
    CopyableMovable(CopyableMovable &&)      { std::cout << "move" << '\n'; }
};

void foo(CopyableMovable cm)
{ }

int main()
{
    typedef std::function<void(CopyableMovable)> byValue;

    byValue fooByValue = foo;

    CopyableMovable cm;
    fooByValue(cm);
}
// outputs: default copy move move
Run Code Online (Sandbox Code Playgroud)

我们在这里看到cm执行的副本(这似乎是合理的,因为byValue's参数是按值获取的),但是有两个动作.由于它function是在副本上运行cm,它移动其参数的事实可以被视为一个不重要的实现细节.但是,以下一起使用functionbind …

c++ bind function c++11

17
推荐指数
1
解决办法
1534
查看次数

为什么GCC的std :: function不使用对值传递的参数的rvalue引用来在它们的内部委托之间传递它们?

首先,请考虑以下代码:

#include <iostream>
#include <functional>

struct Noisy
{
  Noisy() { std::cout << "Noisy()" << std::endl; }
  Noisy(const Noisy&) { std::cout << "Noisy(const Noisy&)" << std::endl; }
  Noisy(Noisy&&) { std::cout << "Noisy(Noisy&&)" << std::endl; }
  ~Noisy() { std::cout << "~Noisy()" << std::endl; }
};

void foo(Noisy n)
{
  std::cout << "foo(Noisy)" << std::endl;
}

int main()
{
  Noisy n;
  std::function<void(Noisy)> f = foo;
  f(n);
}
Run Code Online (Sandbox Code Playgroud)

以及它在不同编译器中的输出:

Visual C++ (现场直播)

Noisy()
Noisy(const Noisy&)
Noisy(Noisy&&)
foo(Noisy)
~Noisy()
~Noisy()
~Noisy()
Run Code Online (Sandbox Code Playgroud)

Clang(libc ++)(见现场直播)

Noisy() …
Run Code Online (Sandbox Code Playgroud)

c++ gcc libstdc++ c++11 std-function

15
推荐指数
1
解决办法
1139
查看次数

标签 统计

c++ ×3

c++11 ×3

bind ×1

coding-style ×1

function ×1

gcc ×1

libstdc++ ×1

std-function ×1