繁体   English   中英

`vector 之间的模糊调用<long long> ` 和 ` 向量<string> ` 带有 initializer_list 输入</string></long>

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM