C++ 使用C+是否总是安全的+;14';s自动函数类型返回扣除代替std::common_类型?

C++ 使用C+是否总是安全的+;14';s自动函数类型返回扣除代替std::common_类型?,c++,return,auto,c++14,return-type-deduction,C++,Return,Auto,C++14,Return Type Deduction,我正在将部分代码库从C++11升级到C++14。我有几个数学实用程序函数,它们接受多个输入参数并返回一个类型为std::common\u type\u t的值 我正在考虑用一个简单的auto替换显式返回值。我认为类型推断确实试图在这些情况下找到一种常见类型。有没有这样的情况不起作用 使用auto转换所有出现的std::common_type_T返回值是否总是安全的 示例函数: template<typename T1, typename T2, typename T3> std::

我正在将部分代码库从C++11升级到C++14。我有几个数学实用程序函数,它们接受多个输入参数并返回一个类型为
std::common\u type\u t
的值

我正在考虑用一个简单的
auto
替换显式返回值。我认为类型推断确实试图在这些情况下找到一种常见类型。有没有这样的情况不起作用

使用
auto
转换所有出现的
std::common_type_T
返回值是否总是安全的

示例函数:

template<typename T1, typename T2, typename T3> 
std::common_type_t<T1, T2, T3> getClamped(T1 mValue, T2 mMin, T3 mMax)
{       
    return mValue < mMin ? mMin : (mValue > mMax ? mMax : mValue);
}
模板
std::通用型夹紧(T1 M值、T2 mMin、T3 mMax)
{       
返回mValuemMax?mMax:mValue);
}

不,它并不总是安全的

我假设你的数学函数做的不止这些,但这里有一个例子,结果会有所不同

template <class T, class U>
std::common_type_t<T, U> add(T t, U u) { return t + u; }
模板
std::common_type_t add(t,U){返回t+U;}

如果使用两个
char
s调用此函数,结果将是一个
char
。你会自动推断返回类型吗?它会产生一个
int

否,但是?:有一个公共类型。我能问一下,为什么你会为这样的函数接受不同类型的参数,而不仅仅是一个单一类型的参数吗?@mattnewport:可能是因为它不能以其他方式推断。思考一下std::min(1,1.)。对于这种特殊情况,最好防止对最小值/最大值进行扣除,但这不适用于一般情况。@K-ballo我不清楚在什么地方这样做是可取的,正如你所说,在最小值的情况下,或者在我不认为的问题中,在钳位函数的情况下,这不是你真正想要的。@mattnewport,基本上正如K-ballo所说,还有一些函数使用(数学)向量类型。我通常返回
Vector2D
,以确保返回最通用的向量type@Jarod42很容易错过,但他使用的是
std::common\u type\t
,而不是
std::common\u type
。这意味着您不需要用
typename std::XXX::type
来包围trait。然而,这只在C++14中有效。@PhilWright:我的评论是在Vittorio编辑之前。但是谢谢,现在我可以删除我的过时评论了。