为何std::emplace_back无法推导C风格数组的类型?
问题原因解析
核心原因是C++模板参数推导规则和初始化列表的特性共同作用的结果:
直接初始化
Foo foo({0.f, 0.f})能成功,是因为这属于直接调用构造函数的场景,编译器可以把{0.f,0.f}推导为长度为2的const float数组,完美匹配构造函数的const float (&t)[2]引用参数。但
std::emplace_back是模板函数,它需要先推导模板参数类型,再把参数转发给Foo的构造函数。而{0.f,0.f}是一个无类型的初始化列表(braced-init-list),C++的模板推导规则里,这种初始化列表无法被自动推导成const float (&)[2]这类数组引用类型——模板推导对无类型初始化列表有严格限制,除非目标是std::initializer_list,否则没法自动匹配到具体的数组引用类型。当你显式指定
emplace_back<const float (&)[2]>时,相当于跳过了模板参数推导环节,直接告诉编译器要把{0.f,0.f}转换成const float (&)[2]类型,这时候参数就能正确匹配Foo的构造函数,自然编译通过。
内容的提问来源于stack exchange,提问作者xubury
相关产品推荐
相关产品推荐

