【发布时间】:2019-01-11 15:57:57
【问题描述】:
以下情况的类型推导失败。如果我为 someFunc 指定模板参数,它就会编译。我肯定看到这是一个奇怪的案例,但如果我能让它工作就好了。有没有另一种方法来制定它,可以在不提供模板参数的情况下编译? C++17 解决方案很好。
#include <type_traits>
template<typename T>
using choose_arg_type = typename std::conditional<std::is_fundamental<T>::value,T,const T &>::type;
template<typename T>
T someFunc(choose_arg_type<T> arg)
{
return arg + arg;
}
int main()
{
auto result = someFunc(0.0);
return 0;
}
【问题讨论】:
-
为什么不总是使用
const T&?作为模板/可见代码,如果没有完全内联,我希望编译器以正确的方式传递参数。 -
我认为编译器可以为您处理此优化。
-
@Jarod42 可能是 OP 不想将引用绑定到基本 constexpr 和 ODR 使用它们?
-
内联代码时编译器可能会优化,但一般不会,这会导致性能下降。
-
所以 - 是的......这是关于性能的。我读过的普遍看法是,通过价值传递基本类型的性能更好。一个原因可能是缓存位置。但是这个简单的测试并没有显示出任何区别:quick-bench.com/BXdkUX2YfBBnFg7m2gsOKo0dbkg