gpt4 book ai didi

c++ - clang++ 12 是否支持 C++20 std::construct_at?

转载 作者:行者123 更新时间:2023-12-03 06:53:42 41 4
gpt4 key购买 nike

我正在使用最近批准的 C++20 标准特性 std::construct_at()并试图更加熟悉他们......
我已经基于 example from CppReference.com 构建了一个示例:

#include <memory>

struct S {
int a;
int b;
};

int main() {
std::allocator<S> alloc;
S * s = alloc.allocate(1);
std::construct_at(s, 42, 43); // GCC 10.2 OK Clang 12 NOT
std::destroy_at(s);
alloc.deallocate(s, 1);
s = nullptr;
}
上面的代码在最新的稳定 GCC 上构建得很好: gcc-10.2 test.cpp -std=c++2a -lstdc++但是我无法使用 Clang 12(主干)或 10(稳定)编译它。 clang-12 test.cpp -std=c++20 -stdlib=libc++有错误:
test.cpp:11:5: error: no matching function for call to 'construct_at'
std::construct_at(s, 42, 43); // GCC 10.2 OK Clang 12 NOT
^~~~~~~~~~~~~~~~~
/usr/local/clang/bin/../include/c++/v1/memory:903:16: note: candidate template ignored: substitution failure [with _Tp = S, _Args = <int, int>]: no matching constructor for initialization of 'S'
constexpr _Tp* construct_at(_Tp* __location, _Args&& ...__args) {
^
1 error generated.
我是否错误地使用了参数包?
Clang C++20 feature list似乎还没有表明它受支持?
我在 Clang 中尝试使用 GCC 工具链,结果相同: --gcc-toolchain=/usr/local/gcc-10.2.0我使用在线编译器资源管理器获得了类似的错误。
如果我通过初始化列表显式构造一个 S(这很可能会破坏就地构造的目的) std::construct_at(s, S{42, 43});然后程序编译但链接失败。
这种方法是否构建了一个暂时打败了construct_at 目的的方法?
如果我使用 std::move 怎么办? std::construct_at(s, std::move(S{42, 43}));在线编译器资源管理器似乎表明移动需要更多的程序集,也许没有它就会有一个省略(我通过添加移动创建了一种悲观主义)?
链接错误是:
/usr/bin/ld: /tmp/test-b07239.o: in function `std::__1::__throw_length_error(char const*)':
test.cpp:(.text._ZNSt3__120__throw_length_errorEPKc[_ZNSt3__120__throw_length_errorEPKc]+0x12): undefined reference to `__cxa_allocate_exception'
/usr/bin/ld: test.cpp:(.text._ZNSt3__120__throw_length_errorEPKc[_ZNSt3__120__throw_length_errorEPKc]+0x30): undefined reference to `typeinfo for std::length_error'
/usr/bin/ld: test.cpp:(.text._ZNSt3__120__throw_length_errorEPKc[_ZNSt3__120__throw_length_errorEPKc]+0x3a): undefined reference to `std::length_error::~length_error()'
显然 -stdlib=libc++ should be used linked with an ABI : -lstdc++解决链接错误同时 -lc++abi仍然错过:
/usr/bin/ld: /tmp/test-bb0950.o: in function `std::length_error::length_error(char const*)':
test.cpp:(.text._ZNSt12length_errorC2EPKc[_ZNSt12length_errorC2EPKc]+0x23): undefined reference to `std::logic_error::logic_error(char const*)'
难道我缺少另一个用于 logic_error 的库吗?
回到手头的关键问题:
  • Clang 是否支持 std::construct_at(s, 42, 43); ?
  • 使用初始化列表结构是否会影响性能?移动/移动?
  • 最佳答案

    这与construct_at无关. S是一个聚合体;除了默认和复制/移动构造函数之外,它没有要调用的构造函数。所以S只能通过聚合初始化用值构造。
    这通常需要一个支撑初始化列表(例如: S{3, 5} )。但是 C++20 包含一个特性,允许聚合初始化通过构造函数语法(例如:S(3, 5))工作,只要参数不会调用默认或复制/移动构造函数(在这种情况下,它将调用一个其中)。
    但是Clang doesn't implement that feature as of yet .所以construct_at无法构建聚合。

    关于c++ - clang++ 12 是否支持 C++20 std::construct_at?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64073756/

    41 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com