std::vector::emplace_back 使用 POD C++

std::vector::emplace_back with a POD C++

我有一个相当糟糕的标准 Vector4 结构(数学类型而不是 C++ 类型),它是一个 POD 并且是模板化的:


template<typename T>
struct Vector4 {
    T x, y, z, w;

    Vector4 operator+(const Vector4& other) const { return Vector4{ x + other.x, y + other.y, z + other.z, w + other.w }; }
    Vector4 operator-(const Vector4& other) const { return Vector4{ x - other.x, y - other.y, z - other.z, w - other.w }; }
    Vector4 operator*(const Vector4& other) const { return Vector4{ x * other.x, y * other.y, z * other.z, w * other.w }; }
    Vector4 operator/(const Vector4& other) const { return Vector4{ x / other.x, y / other.y, z / other.z, w / other.w }; }
    Vector4 operator+(const T& a) const { return Vector4{ x + a, y + a, z + a, w + a }; }
    Vector4 operator-(const T& a) const { return Vector4{ x - a, y - a, z - a, w - a }; }
    Vector4 operator*(const T& a) const { return Vector4{ x * a, y * a, z * a, w * a }; }
    Vector4 operator/(const T& a) const { return Vector4{ x / a, y / a, z / a, z / a }; }

    Vector4& operator+=(const Vector4& other) { x += other.x; y += other.y; z += other.z; w += other.w; return *this; }
    Vector4& operator-=(const Vector4& other) { x -= other.x; y -= other.y; z -= other.z; w -= other.w; return *this; }
    Vector4& operator*=(const Vector4& other) { x *= other.x; y *= other.y; z *= other.z; w *= other.w; return *this; }
    Vector4& operator/=(const Vector4& other) { x /= other.x; y /= other.y; z /= other.z; w /= other.w; return *this; }
    Vector4& operator+=(const T& a) { x += a; y += a; z += a; w += a; return *this; }
    Vector4& operator-=(const T& a) { x -= a; y -= a; z -= a; w -= a; return *this; }
    Vector4& operator*=(const T& a) { x *= a; y *= a; z *= a; w *= a; return *this; }
    Vector4& operator/=(const T& a) { x /= a; y /= a; z /= a; w /= a; return *this; }

    T& operator[](size_t index) { return *(reinterpret_cast<T*>(this) + index); }
};

using Vector4f = Vector4<float>;
using Vector4i = Vector4<int>;
using Vector4i32 = Vector4<int32_t>;
using Vector4ui32 = Vector4<uint32_t>;
using Vector4i64 = Vector4<int64_t>;
using Vector4ui64 = Vector4<uint64_t>;

我遇到的问题是我无法制作 Vector4 class 的 std::vector。当我尝试以下操作时:

std::vector<ogl::Vector4f> vec;
vec.emplace_back(1.0f, 2.0f, 3.0f, 4.0f);

我得到这个编译错误

'Vector4::Vector4': no overloaded function takes 4 arguments

我有自己的向量(C++ 类而非数学类)class,我尝试将 emplace_back 与它一起使用,但我遇到了同样的错误。我也尝试过使用和不使用分配器(在我的自定义向量 class 中)并且几乎尝试了一切!

我可以通过定义构造函数来解决这个问题,但它不再成为 POD。使用大括号初始化的正常构造工作正常,所以我不知道有什么问题。

如果有人能解释为什么要 happening/how 解决这个问题(或者如果这是正常行为),我们将不胜感激。

emplace_back 使用括号来初始化值,这意味着在 C++20 之前需要构造函数才能使用它。 C++20 引入了聚合的括号初始化,因此您的代码按原样有效。

在那之前你可以做

vec.push_back({1.0f, 2.0f, 3.0f, 4.0f});