gpt4 book ai didi

c++ - 如何防止构造函数被临时调用

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:23:20 25 4
gpt4 key购买 nike

我有一个类,其构造函数接受一些 vector 并存储它们。

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 的对象长。

但是,单元测试通常使用临时变量构造Xes,如下所示:

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 };

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

我是否必须编写左值/右值引用参数的每个组合(所有七个)并将它们全部标记为已删除?

最佳答案

template<class T, class U>
using is_lvalue_reference_to_possibly_const = std::integral_constant<bool,
std::is_same<T, const U&>::value || std::is_same<T, U&>::value>;

template<class VI, class VF, class VS>
using check_value_cat_for_ctor = typename std::enable_if<
is_lvalue_reference_to_possibly_const<VI, std::vector<int>> &&
is_lvalue_reference_to_possibly_const<VF, std::vector<float>> &&
is_lvalue_reference_to_possibly_const<VS, std::vector<string>>>::type;

template<class VI, class VF, class VS, class = check_value_cat_for_ctor<VI, VF, VS>>
X(VI&&, VF&&, VS&&) {
// ...
}

关于c++ - 如何防止构造函数被临时调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48385994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com