在使用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
相关的:
std::string
类型(在foo声明中),它是合法的? 提前致谢。
答案 0 :(得分:5)
该语言允许从 braced-init-list 中扣除initializer_list<T>
,您的代码缺失。将通话更改为error_msg
至
error_msg({"FunctionX: ", expected, actual});
那么,这是否意味着只要所有参数都可以隐式转换为声明的
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