为什么以下initializer_list函数失败?

mod*_*ler 1 c++ initializer-list c++11

在使用initalizer_list练习函数时,我正在密切关注本书示例(关于C++入门)需要帮助来调试它失败的原因:

#include <iostream>
#include <string>
#include <vector>
#include <cassert>
#include <iomanip>
#include <initializer_list>

using std::cout;   using std::endl;
using std::cin;    using std::cerr;  
using std::begin;  using std::end;           /* lib begin and end function (for arrays) */
using std::vector;
using std::string; using std::setw;  
using std::left;   using std::right;         /* align print out result */
using std::initializer_list;

void error_msg(initializer_list<string> il) {
  for(const auto &elem : il)
    cout << elem << " ";
  cout << endl;

}

int main(int argc, char *argv[]) {

  string expected = "Hello", actual = "There";

  error_msg("FunctionX: ", expected, actual);

  return 0;

}
Run Code Online (Sandbox Code Playgroud)

它得到编译错误:

g++ -O0 testerrormsg.cpp -lm -o testerrormsg -g -Wall -lpthread -std=c++11
testerrormsg.cpp: In function ‘int main(int, char**)’:
testerrormsg.cpp:27:44: error: could not convert ‘(const char*)"FunctionX: "’ from ‘const char*’ to ‘std::initializer_list<std::basic_string<char> >’
Run Code Online (Sandbox Code Playgroud)

另外,我可以问几个问题,因为它是initializer_list相关的:

  1. 请注意,在上面的代码示例(来自本书)中,参数的类型为"char*,std :: string,std :: string".那么,这是否意味着只要所有参数都可以隐式转换为声明的std::string类型(在foo声明中),它是合法的?
  2. (摘自本书)"initializer_list是表示值数组的库类型".我以前从未见过这样的措辞.一组值与一组对象相比有什么不同?

提前致谢.

Pra*_*ian 5

该语言允许initializer_list<T>从braced-init-list中删除一个代码缺失的.将通话更改error_msg为

error_msg({"FunctionX: ", expected, actual});
Run Code Online (Sandbox Code Playgroud)

现场演示


那么,这是否意味着只要所有参数都可以隐式转换为声明的std::string类型(在foo声明中),它是合法的?

一旦你修复了函数调用,这就是它的意思.

一组值与一组对象相比有什么不同?

我不认为在这种情况下有任何不同.该标准描述了initializer_list<T>(§8.5.4/ 5)的行为,就好像实现已经分配了包含N类型元素的临时数组一样const T.在initializer_list<T>随后提供指针(迭代),以在第一和一个超出了数组的最后一个元素.