为什么以下initializer_list函数失败?

时间:2014-07-07 17:03:53

标签: c++ c++11 initializer-list

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

#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;

}

它出现编译错误:

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> >’

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

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

2 个答案:

答案 0 :(得分:5)

该语言允许从 braced-init-list 中扣除initializer_list<T>,您的代码缺失。将通话更改为error_msg

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

Live demo


  

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

修复函数调用后,这就是它的意思。

  

值数组对象数组相比有何不同?

我认为在这种背景下没有任何区别。该标准描述了initializer_list<T>(§8.5.4/ 5)的行为,就好像实现已经分配了包含N类型const T元素的临时数组一样。然后initializer_list<T>提供指向第一个指针(迭代器)和超出此数组最后一个元素的指针。

答案 1 :(得分:3)

因为您没有传递初始化列表,所以您传递了三个不同的参数。

取而代之的是

error_msg({ "FunctionX: ", expected, actual });  // Note the curly-braces