我有一个类,它的构造函数接收一些向量并将它们存储。
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_;
};
我希望将成员变量转换为引用类型,因为在生产代码中传递给构造函数的值是左值,其生命周期比类X的对象更长。
然而,单元测试通常使用临时变量来构建X对象,例如:
X x{ {42}, {3.14f}, {"hello"} };
如果
X
的成员应该是引用,那么应该避免这样的调用。这可以通过编写一个接受右值引用的构造函数并将其设置为=delete
来实现。X(std::vector<int> && ints, std::vector<float> && floats, std::vector<std::string> && strings) = delete;
如果所有参数都是临时变量,则会防止实例化。不幸的是,它允许通过至少有一个参数为左值的调用:
std::vector<std::string> no_strings;
X x{ {42}, {3.14f}, no_strings };
因为左值引用可以绑定到右值,所以可以调用
(const&, const&, const&)
构造函数。我是否需要编写每种左值/右值引用参数的组合(共七种),并将它们全部标记为已删除?
std::move(const T&)
总是会导致复制。 - 0x5453