[英]Ambiguous call between `vector<long long>` and `vector<string>` with initializer_list input
以下代码:
#include <iostream>
#include <vector>
#include <string>
void fun(const std::vector<long long> &x) {
std::cout << "long long" << std::endl;
}
void fun(const std::vector<std::string> &s) {
std::cout << "string" << std::endl;
}
int main() {
fun({"a", "c"}); // ambiguous call.
}
由于不明确的调用而无法编译。 为什么会这样? 我没有看到const char *
和long long
之间有任何联系。
我可以写一个新的 function 来解决歧义:
void fun(std::initializer_list<const char*> s)
{
}
但我仍然不知道发生了什么。
std::vector<std::string>
有一个以std::initializer_list<std::string>
作为参数的构造函数。 这允许从std::initializer_list<std::string>
构造std::vector<std::string>
::string> 。
然而"a"
和"b"
不是std::string
s,而是类型为const char [n]
的字符串文字(其中n
是每个文字字符串的大小,包括'\0'
终止符); 当在std::initializer_list
上下文中使用时,它们将产生一个std::initializer_list<const char *>
。
此外 C++ 最多允许一次隐式转换,但这里需要两个:从std::initializer_list<const char *>
到std::initializer_list<std::string>
(假设这种隐式转换甚至是可能的,它不是,所以这已经是一个停止器,但让我们假设有一个),然后使用非explicit
构造函数从std::initializer_list<std::string>
到std::vector<std::string>
。
TLDR:C++的正式技术规范和规则跑到上千页文字上,这根本是不允许的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.