小编san*_*orn的帖子

(c++23 隐式移动) 将移动的本地存储变量作为仅带括号的右值引用返回?

关于“更简单的隐式移动”(P2266R1)提案,我不确定我是否正确理解了这个新的“符合移动条件”的东西。

如果不正确,请更正以下几点:
[直播]

  1. std::forward 成为完美转发收到的右值参考的可选
template<class T>
T&& seven(T&& x) { return std::forward<T&&>(x); }
Run Code Online (Sandbox Code Playgroud)

变成

template<class T>
T&& seven(T&& x) { return x; }
Run Code Online (Sandbox Code Playgroud)
  1. std::move 对于本地创建的 rvalue ref 成为可选
Widget&&
test_seven(Widget w) {
    Widget&& rr = seven(std::move(w));
    return std::move(rr);
}
Run Code Online (Sandbox Code Playgroud)

变成

Widget&&
test_seven(Widget w) {
    Widget&& rr = seven(std::move(w));
    return rr;
}
Run Code Online (Sandbox Code Playgroud)
  1. std::moveoptionaly 变为parenthesis only为本地创建的事物返回一个右值引用。
Widget&& h3(Widget t) {
  return std::move(t);
}
Run Code Online (Sandbox Code Playgroud)

变成

Widget&& h3(Widget t) {
  return (t);
}
Run Code Online (Sandbox Code Playgroud)

注意:(3) : clang …

c++ rvalue-reference move-semantics pass-by-rvalue-reference c++23

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

标准如何定义捕获运行时绑定的数组?

请考虑以下代码:

#include <iostream>
#include <algorithm>
#include <numeric>

int main()
{
    volatile auto width = uint64_t(5);

    alignas(16)
    char runtime[width]; std::iota(runtime,runtime+width,'1');

    auto out = [](auto& curr) { std::cout << curr; };

    auto capt_ref_to_runtime_bound_arr = [&runtime,width,out](auto &curr) { 
                                             std::for_each(runtime, runtime+width, out); 
                                             std::cout << " and width=" 
                                                       << sizeof(runtime) / sizeof(*runtime)
                                                       << '\n'; 
                                         };

    // clang code crashes even if below is commented out.
    // std::for_each(runtime,runtime+width,capt_ref_to_runtime_bound_arr);
}
Run Code Online (Sandbox Code Playgroud)

关于[&runtime]捕获

  1. 海湾合作委员会似乎衰败int(&)[width]到了char *(见下面的wandbox)

  2. clang刚崩溃成红色文本块(参见下面的wandbox)

后来,我跑到N3639,它说有些功能被切断了(例如上面演示中的sizeof实际上是不合格的).但为什么编译器不向我解释这些截止?如果标准允许这种捕获,它们如何定义它?


ASM:godbolt.org/g/ptRRRp

GCC 7.2 …

c++ arrays gcc clang c++17

3
推荐指数
1
解决办法
258
查看次数

view :: c_str是否存在view :: split的问题?

特定

auto cstr = "quick brown fox";
Run Code Online (Sandbox Code Playgroud)

我们有一组适配器只是为了分割单词然后尝试将它们显示为格式化范围.

auto adaptors = ranges::view::split(' ') | ranges::view::all;
Run Code Online (Sandbox Code Playgroud)

如果source是string_view,那就是okey.

auto sv = std::string_view{cstr};
ranges::copy(sv | adaptors, ranges::ostream_iterator(std::cout,";") );
Run Code Online (Sandbox Code Playgroud)

输出:[wandbox]

[q,u,i,c,k];[b,r,o,w,n];[f,o,x];
Run Code Online (Sandbox Code Playgroud)

然后尝试使用view :: c_str

auto cstr_rng = ranges::view::c_str(cstr);
// Won't compile
// ranges::copy(cstr_rng | adaptors, ranges::ostream_iterator(std::cout,";") );
Run Code Online (Sandbox Code Playgroud)

错误:[CE]

/opt/compiler-explorer/libs/rangesv3/trunk/include/range/v3/view/split.hpp: In instantiation of 'ranges::v3::split_view<Rng, Fun>::cursor<IsConst>::cursor(ranges::v3::split_view<Rng, Fun>::cursor<IsConst>::fun_ref_t, ranges::v3::iterator_t<Rng>, ranges::v3::sentinel_t<Rng>) [with bool IsConst = true; Rng = ranges::v3::delimit_view<ranges::v3::iterator_range<const char*, ranges::v3::unreachable>, char>; Fun = ranges::v3::view::split_fn::element_pred<ranges::v3::delimit_view<ranges::v3::iterator_range<const char*, ranges::v3::unreachable>, char>&>; ranges::v3::split_view<Rng, Fun>::cursor<IsConst>::fun_ref_t = ranges::v3::view::split_fn::element_pred<ranges::v3::delimit_view<ranges::v3::iterator_range<const char*, ranges::v3::unreachable>, char>&>; ranges::v3::iterator_t<Rng> …
Run Code Online (Sandbox Code Playgroud)

c++ lazy-evaluation range-v3

3
推荐指数
1
解决办法
289
查看次数

在PostgreSQL中,在授予序列时,我是否只能授予USAGE而不是SELECT,USAGE?

我阅读了关于在PostgreSQL中授予序列的答案.一般来说,他们说同时授予SELECT,USAGE.我想知道我是否只能授予使用权.哪一个是授予序列的最佳实践,为什么?

postgresql database-sequence

2
推荐指数
1
解决办法
173
查看次数

C ++ 20中严格的别名规则是否允许在标准c ++ Unicode字符和下划线类型之间使用“ reinterpret_cast”?

执行C++20严格别名规则 [basic.lval] / 11任意允许下...

  1. 介于char*和之间char8_t*
string str = "string";
u8string u8str { (char8_t*) &*str.data() }; // c++20 u8string

u8string u8str2 = u8"zß?"
string str2 { (char*) u8str2.data() };
Run Code Online (Sandbox Code Playgroud)
  1. 投之间uint32_t*uint_least32_t*char32_t*
vector<uint32_t> ui32vec = { 0x007a, 0x00df, 0x6c34, 0x0001f34c };
u32string u32str { (char32_t*) &*ui32vec.data(), ui32vec.size() };

u32string u32str2 = U"zß?"
vector<uint32_t> ui32vec2 { (uint32_t*) &*u32str2.begin(),
                            (uint32_t*) &*u32str2.end() };
Run Code Online (Sandbox Code Playgroud)
  1. 投之间uint16_t*uint_least16_t*char16_t*
vector<uint16_t> ui16vec = { 0x007a, …
Run Code Online (Sandbox Code Playgroud)

c++ strict-aliasing undefined-behavior c++20

2
推荐指数
1
解决办法
156
查看次数

根据“auto(x)”论文(wg21.link/p0849),为什么“return std::forward&lt;T&gt;”无法完美转发用“T&amp;&amp;”输入的参数?

auto (x)表达式已添加到语言中。理性是因为我们无法以此完善前向衰减。

template<class T>
constexpr decay_t<T> decay_copy(T&& v) noexcept(
    is_nothrow_convertible_v<T, decay_t<T>>) {
    return std::forward<T>(v);
}
Run Code Online (Sandbox Code Playgroud)

decay_copy根据论文https://wg21.link/p0849 ,这只是无法避免复制。

一个明显的问题是,decay_copy(x.front())副本x.front()即使x.front()是一个prvalue,换句话说,是一个副本。


是否应该std::forward<T>完美转发使用通用/转发引用声明的输入参数?

c++ type-traits perfect-forwarding auto c++23

2
推荐指数
1
解决办法
93
查看次数

如果std :: addressof是&的可读版本.什么是*&的可读版本?

*&x

使用c ++ 11,我们可以写为

* std::addressof(x)

但是,这个表达式有更多可读版本吗?

constexpr uint64_t lil_endian = 0x65'6e'64'69'61'6e; 
    // a.k.a. Clockwise-Rotated Endian which allocates like
    // char[8] = { n,a,i,d,n,e,\0,\0 }

constexpr auto& arr = 
    reinterpret_cast<const std::array<char,8> &>
        (*std::addressof(lil_endian) );

int main()
{
    const auto str = std::string(arr.crbegin()+2, arr.crend() );

    std::cout << str << '\n'
              << str.size() << '\n' << '\n';
    for (const auto ch : str) {
        std::cout << ch << " : " << std::hex << (unsigned int) ch << '\n';
    }

}


endian …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 address-operator

1
推荐指数
2
解决办法
244
查看次数

如何将 %rax 中的 double 移动到 %ymm 或 %zmm 上的特定 qword 位置?(卡比湖或更高版本)

这个想法是,我想收集的返回的值double成一个矢量寄存器,用于机加工imm width在一个时间而不第一存储回到存储器。

特定的处理vfma与其他两个操作数都是constexpr,因此它们可以简单地由_mm256_setr_pd调用或从 中对齐/未对齐的内存加载constexpr array

有没有办法%ymm直接从 value in 中将double 存储在特定位置以%rax进行收集?

目标机器是 Kaby Lake。更有效的未来向量指令也是受欢迎的。

c++ x86-64 inline-assembly intrinsics avx

0
推荐指数
1
解决办法
442
查看次数