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} };
}