我玩弄auto
在std::pair
。在下面的代码中,函数f
应该返回std::pair
依赖于模板参数的类型的。
一个工作示例:
例1
template <unsigned S>
auto f()
{
if constexpr (S == 1)
return std::pair{1, 2}; // pair of ints
else if constexpr (S == 2)
return std::pair{1.0, 2.0}; // pair of doubles
else
return std::pair{0.0f, 0.0f}; // pair of floats
}
这适用于gcc 9.2,gcc 10.0,clang 9.0和clang 10.0。
接下来,std::pair
出于清楚的原因,我想显式地将返回类型编写为:
例子2
template <unsigned S>
std::pair<auto, auto> f()
{
if constexpr (S == 1)
return {1, 2};
/* ... */
}
gcc 9.2 / 10.0和clang 9.0 / 10.0均未能对此进行编译。
gcc 9.2
error: invalid use of 'auto'
error: template argument 1 is invalid // first argument (auto) of std::pair
error: template argument 2 is invalid // second argument (auto) of std::pair
error: cannot convert '<brace-enclosed initializer list>' to 'int' in return
从最后一条错误消息来看,gcc 9.2似乎认为这std::pair<auto, auto>
是一个int
。如何解释呢?
海湾合作委员会10.0
error: returning initializer list
此错误是可以理解的,但是,我希望std::pair
调用该构造函数,或者这里缺少什么?
lang9.0和10.0
'auto' not allowed in template argument
excess elements in scalar initializer
no matching function for call to 'f'
好的,c不喜欢任何一个。从第二条错误消息中,似乎clang也相信返回类型为int
。
最后,为了解决使用gcc 10.0编译时获得的错误,我决定std::pair
显式返回:
实施例3
template <unsigned S>
std::pair<auto, auto> f()
{
if constexpr (S == 1)
return std::pair{1, 2};
/* ... */
}
lang9.0和10.0
与以前相同,但有一个附加功能:
no viable conversion from returned value of type 'std::pair<int, int>' to function return type 'int'
这里c仍然认为我们要返回一个int
?
gcc 9.2
和之前一样。
海湾合作委员会10.0
有用!
我猜某些功能仍必须实现,或者在上述一种情况下,是否有一个编译器正确而另一个错误?我认为示例2应该有效。还是不应该?