我已经在这个问题中表达了关于CTAD与指定初始化器混淆的看法,但我对一个非常相似的代码片段还有另一个困惑
template <typename int_t=int, typename float_t=float>
struct my_pair {
int_t first;
float_t second;
};
template<typename ... ts>
my_pair(ts...) -> my_pair<ts...>;
int main() {
my_pair x{.second = 20.f};
static_assert( std::is_same_v<decltype(x.first), int> ); //FAILS <- its deduced to float
static_assert( std::is_same_v<decltype(x.second), float> );
}
似乎推断指南会导致first
的类型被推断为float
,即使在指定的初始化中没有明确使用.first
。推断指南显然只关心初始化器中的顺序,而不管关键字(.second
)。这个推断指南应该聪明一些,还是应该有一个“指定推断指南”呢?请参见https://godbolt.org/z/cm6Yi7上的示例。