C++ 为什么在更改std::vector的分配器时初始值设定项列表不可用?

C++ 为什么在更改std::vector的分配器时初始值设定项列表不可用?,c++,c++11,memory-alignment,initializer-list,eigen3,C++,C++11,Memory Alignment,Initializer List,Eigen3,在我的项目中,我将使用的点类型从Eigen::Vector2f更改为Eigen::Vector2d,并遇到对齐问题 以下是代码的简化版本: #include <vector> #include <Eigen/Eigen> int main() { std::vector<Eigen::Vector2d> points = { {0,0}, {0,1} }; } GCC错误输出: 错误:无法将“{0,0},{0,1}”从“”转换为“std::vect

在我的项目中,我将使用的点类型从
Eigen::Vector2f
更改为
Eigen::Vector2d
,并遇到对齐问题

以下是代码的简化版本:

#include <vector>
#include <Eigen/Eigen>

int main()
{
    std::vector<Eigen::Vector2d> points = { {0,0}, {0,1} };
}
GCC错误输出:

错误:无法将“{0,0},{0,1}”从“”转换为“std::vector”
所以我想知道:

  • 更改
    std::vector的分配器时,为什么初始值设定项列表不可用

    • 这是因为对齐吗
    • 我可以调整初始值设定项列表吗
  • 为什么专业化版本失败了

    • 这些是否缺少初始值设定项列表功能

在研究了
Eigen/StdVector
包含文件(确切地说,它在中)之后,问题似乎源于此头文件中
std::vector
的部分模板专门化。只要您将
Eigen::aligned_分配器
用作分配器,此部分模板专门化就会替换STL
向量
。这种专门化似乎缺少C++11的特性

详细说明除了替换分配器之外,还需要此专门化的原因: 在C++11之前,
std::vector
的函数可以通过值获取额外的参数来初始化新创建的元素。按值传递参数将丢弃任何对齐修改器,并且不能用于固定大小的可矢量化特征对象(请参见SIMD)

编辑: 经过更多的测试,我意识到
std::vector
的C++11实现没有上述问题。因此,要解决对齐问题,只需填写
Eigen::aligned_分配器
。但是不包括
Eigen/StdVector
。包含此文件将阻止您使用
std::vector
的C++11实现,因为此标头将
Eigen::aligned_分配器定义为分配器的部分专门化

#include <vector>
#include <Eigen/Eigen>
#include <Eigen/StdVector>
// EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Eigen::Vector2d)

int main()
{
    std::vector<Eigen::Vector2d, Eigen::aligned_allocator<Eigen::Vector2d>> points = { {0,0}, {0,1} };
    // std::vector<Eigen::Vector2d> points = { {0,0}, {0,1} };
}