相关疑难解决方法(0)

使用前进的优点

在完美转发中,std::forward用于转换命名的右值引用t1t2未命名的右值引用.这样做的目的是什么?inner如果我们离开t1&t2作为左值,那将如何影响被调用的函数?

template <typename T1, typename T2>
void outer(T1&& t1, T2&& t2) 
{
    inner(std::forward<T1>(t1), std::forward<T2>(t2));
}
Run Code Online (Sandbox Code Playgroud)

c++ c++-faq rvalue-reference perfect-forwarding c++11

411
推荐指数
6
解决办法
6万
查看次数

如何防止使用临时调用构造函数

我有一个类,其构造函数采用一些向量并存储它们.

struct X {
    X(std::vector<int> const& ints, std::vector<float> const& floats, std::vector<std::string> const& strings)
    : ints_{ints}
    , floats_{floats}
    , strings_{strings}      
    {};

    std::vector<int> ints_;
    std::vector<float> floats_;
    std::vector<std::string> strings_;
};
Run Code Online (Sandbox Code Playgroud)

我想将成员变量转换为引用,因为在生产代码中,传递给构造函数的值是左值,其生命周期比类X的对象长.

但是,单元测试通常X用临时构造es,如下所示:

X x{ {42}, {3.14f}, {"hello"} };
Run Code Online (Sandbox Code Playgroud)

如果X要引用成员,则应阻止此类调用.这可以通过编写一个构造函数来完成,该构造函数接受rvalue引用并制作它=delete.

X(std::vector<int> && ints, std::vector<float> && floats, std::vector<std::string> && strings) = delete;
Run Code Online (Sandbox Code Playgroud)

如果所有参数都是临时的,这将阻止实例化.不幸的是,它允许通过调用,其中至少有一个参数是左值:

std::vector<std::string> no_strings;
X x{ {42}, {3.14f}, no_strings };
Run Code Online (Sandbox Code Playgroud)

因为左值引用愿意绑定到rvalues,所以(const&,const&,const&)可以调用构造函数.

我是否必须编写lvalue/rvalue ref参数的所有组合(全部七个)并将它们全部标记为已删除?

c++ c++11

6
推荐指数
1
解决办法
267
查看次数

为什么&&有时绑定左值而不是其他时间?

好的,我有这个代码:

struct Mine{
    template<typename T>
    Mine(T&& x){
    }
};
void nFoo(int&& x){
}
void sFoo(Mine x){
}
Run Code Online (Sandbox Code Playgroud)

nFoo需要一个int&&直接,而sFoo做一些finagling来获得同样的效果.

考虑以下代码:

nFoo(12); //Works

int x = 0;
nFoo(x);  //Cannot bind int (lvalue) to int&&

sFoo(12); //Works
sFoo(x);  //Works
Run Code Online (Sandbox Code Playgroud)

为什么int&&有时允许从lvalues 绑定,有时不允许绑定?

c++ rvalue lvalue rvalue-reference

3
推荐指数
1
解决办法
113
查看次数