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相关的:
std::string类型(在foo声明中),它是合法的?提前致谢.
该语言允许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>随后提供指针(迭代),以在第一和一个超出了数组的最后一个元素.
| 归档时间: |
|
| 查看次数: |
137 次 |
| 最近记录: |