alf*_*lfC 2 c++ initialization std constexpr
我正在实现我自己的容器,并且我试图使其尽可能对 constexpr 友好。
\n在这个过程中,我发现这std::uninitialized_copy不是 constexpr,因此我无法使用标准算法实现复制分配。
然而, constexprstd::vector 是否友好:
constexpr auto f() {\n std::vector<int> v = {1, 2, 3};\n return v.size();\n}\n\nstatic_assert(f() == 3);\nRun Code Online (Sandbox Code Playgroud)\n当我替换为我自己的容器时,我无法实现此目的std::vector。\n我收到错误:
... error: call to non-\xe2\x80\x98constexpr\xe2\x80\x99 function \xe2\x80\x98_ForwardIterator std::uninitialized_copy(_InputIterator, ...\nRun Code Online (Sandbox Code Playgroud)\n我想知道标准库(例如 stdlib)如何实现这一点。\n它是否使用uninitialized_copyconstexpr 的秘密实现?\nconstexpr uninitalized_copy 是否可以实现?
我想挑战在于拥有constexpr addressof和constexpr construct_at。\n是否有一个我可以回退的实现?
std::vector不使用std::uninitialized_copy. 它要求std::allocator_traits::construct执行复制构造。后者默认调用,它在常量求值 ( [expr.const]/6std::construct_at )期间进行特殊处理。
在实践中,编译器会进行std::construct_at特殊处理,以便在不断求值期间可以使用placement new。
operator new并在内部调用它std::construct_at。(好吧,这并不是那么秘密。)std。std::construct_at。| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |