gpt4 book ai didi

c++ - 模板化函数只接受右值

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:12:55 26 4
gpt4 key购买 nike

写一个只接受左值的函数很容易

template <typename T>
void f(T&);

但是因为universal references ,编写一个只接受右值引用的代码并不简单。有没有办法编写一个只接受右值引用的通用函数? (返回类型并不是真正的问题)

template <typename T>
void only_rvals(T&&);

在哪里

int i{};
only_rvals(i); // fails to compile
only_rvals(6); // successfully compiles

最佳答案

添加一个

template<class T>
void only_rvals(T&)=delete;

重载到通用的。它将是首选,如果选择会产生错误。

或者,SFINAE 检查,或后 C++1y 需要子句,或 static_assert,或使用 is_reference 或类似的标签分派(dispatch)都可以。

理想情况下,您希望调用时出现故障、代码清晰、诊断清晰、解决方案稳健且可扩展。后 C++1y 要求最终将是最好的。 static_assert 给出了明确的诊断(就像标记调度一样,但你想要一个名为 is_rvalue 的特征被调度到 true_type),SFINAE 和 =delete 使错误发生在调用站点。 =delete 无法扩展到更多参数,SFINAE 很脆弱。

SFINAE 和 requires 允许使用替代重载。这可能需要也可能不需要。

关于c++ - 模板化函数只接受右值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24232186/

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