【问题标题】:C++11 initializer_list errorC++11 初始化器列表错误
【发布时间】:2013-06-10 15:20:23
【问题描述】:

考虑代码:

#include <iostream>
#include <vector>
#include <string>

int main()
{
    std::vector<std::string> v{{"awe", "kjh"}}; // not v{"awe", "kjh"}

    std::cout << v.size() << std::endl;

    return 0;
}
  1. 此代码是否错误?或者在初始化向量时使用双精度{} 是否有效?

  2. 我在 gcc 和 MSVC 上试过这段代码。 MSVC 2012 + 编译器 Nov 2012 只是无法编译它,这并不奇怪。 使用 gcc 4.7 或 4.8 编译的这段代码在程序执行期间会出现运行时错误。这种行为正确吗?

不幸的是,无法使用其他编译器对其进行测试。

【问题讨论】:

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


【解决方案1】:

请注意,您的初始化等效于:

std::vector<std::string> v{std::string{"awe", "kjh"}}; 
// not: std::vector<std::string> v{std::string{"awe"}, std::string{"kjh"}};

标准不需要这种std::string 类型实现的构造函数,因此基于特定的STD 实现,我猜代码可以做不同的事情。

问候, &rzej

【讨论】:

    【解决方案2】:

    内部 {} 被视为 std::string 构造函数。 如果你这样做,它将在运行时失败

    std::string> s{"awe", "kjh"};
    

    【讨论】:

      猜你喜欢
      • 2016-01-04
      • 1970-01-01
      • 2012-03-08
      • 2019-07-10
      • 2015-02-28
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多