为什么不对initializer_list中的值进行类型检查?

时间:2019-07-28 08:39:35

标签: c++ g++ std initializer-list list-initialization

如何在没有任何警告或错误的情况下进行编译和运行?我不明白如何将x:Name的取消引用值(它是一个整数)毫无问题地分配给字符串current

a

打印的字符串是

class Test {
public:
  string a;

  Test(initializer_list<int> t) {
    auto current = t.begin();

    // I am assigning an int to a string!
    a = *current;
  }
};

int main() {
  Test test{65};
  printf("%s\n", test.a.c_str());
}

相反,这段非常相似的代码会产生编译时错误:

A

错误是:

int main() {
  initializer_list<int> test1{65};
  auto current = test1.begin();
  string b = *current;

  return 0;
}

1 个答案:

答案 0 :(得分:4)

请注意,a = *current;string b = *current;执行不同的操作。

a = *current;是一个赋值,它导致对operator=的调用,而std::string::operator=具有char的重载,这使a = *current;正常工作( implicit conversionintchar)。

  

4)将字符ch替换为assign(std::addressof(ch), 1)

string b = *current;是一个初始化,它尝试调用constructor of std::string来初始化b。但是这些构造函数没有这样的重载,即int(或char)不起作用,那么string b = *current;将不起作用。