相关疑难解决方法(0)

为什么使用 `std::aligned_storage` 据称会因无法“提供存储”而导致 UB?

灵感来源:为什么 std::aligned_storage 在 C++23 中被弃用以及使用什么替代?

\n

链接的提案P1413R3(不赞成使用std::aligned_storage)表示:

\n
\n

使用aligned_*调用未定义的行为(类型无法提供存储。)

\n
\n

这是指[intro.object]/3

\n
\n

如果在与N \xe2\x80\x9d 类型的 \xe2\x80\x9carray或N \xe2 \ 类型 \xe2\x80\x9carray 的另一个对象e关联的存储中创建了完整对象 ([expr.new]) x80\x9d ([cstddef.syn]),该数组为创建的对象提供存储,如果: ... unsigned char std\xe2\x80\x8b::\xe2\x80\x8bbyte

\n
\n

然后,该标准在一些定义中继续使用术语“提供存储”,但我没有看到它在任何地方说使用不同类型作为新放置的存储(无法“提供存储”)会导致 UB 。

\n

那么,问题是:std::aligned_storage当用于放置新时,是什么导致了UB?

\n

c++ language-lawyer c++23

19
推荐指数
2
解决办法
1563
查看次数

使用 std::array 作为存储会调用 UB 吗?

std::array<std::byte, N> storage分配一些内存可以用作存储吗?例如,a.data()即使分配对象的生命周期与 无关,在 上调用placement-new 是否安全std::array

std::aligned_storage_t在 C++23 中被弃用的原因是,它的 UB 植根于其设计(并且 API 很差,但在这个问题中并非如此),虽然它非常接近 的用例std::array,所以是否强制使用C 风格的数组std::byte storage[N]作为内存分配的存储,不是std::array(甚至可能std::vector)。

c++ lifetime placement-new language-lawyer c++20

5
推荐指数
1
解决办法
260
查看次数

默认概念约束函数从未选择用于实例化

在使用 C++20 时,我遇到了一个奇怪的情况,我不确定这是由于 C++20 的婴儿期而导致的编译器缺陷,或者这是否是正确的行为。

问题在于,特定的约束函数要么没有正确选择,要么产生编译错误——完全取决于定义的顺序。

这种情况发生在特定情况下:

  • 构造函数/析构函数/成员函数受requires, 和约束
  • 对于不满足T子句的某些实例此构造函数/析构函数/成员函数将被隐式删除requires

例如,考虑这个基本naive_optional<T>实现:

template <typename T>
class naive_optional {
public:
    naive_optional() : m_empty{}, m_has_value{false}{}

    ~naive_optional() requires(std::is_trivially_destructible_v<T>) = default;
    ~naive_optional() {
        if (m_has_value) {
            m_value.~T();
        }
    }
private:
    struct empty {};
    union {
        T m_value;
        empty m_empty;
    };
    bool m_has_value;
};
Run Code Online (Sandbox Code Playgroud)

此代码适用于普通类型,例如naive_optional<int>,但无法实例化非普通类型,例如naive_optional<std::string>由于隐式删除的析构函数:

<source>:26:14: error: attempt to use a deleted function
    auto v = naive_optional<std::string>{};
             ^
<source>:8:5: note: explicitly defaulted function …
Run Code Online (Sandbox Code Playgroud)

c++ c++-concepts c++20

4
推荐指数
1
解决办法
297
查看次数