关于“更简单的隐式移动”(P2266R1)提案,我不确定我是否正确理解了这个新的“符合移动条件”的东西。
如果不正确,请更正以下几点:
[直播]
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)
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)
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
请考虑以下代码:
#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]捕获
海湾合作委员会似乎衰败int(&)[width]到了char *(见下面的wandbox)
clang刚崩溃成红色文本块(参见下面的wandbox)
后来,我跑到N3639,它说有些功能被切断了(例如上面演示中的sizeof实际上是不合格的).但为什么编译器不向我解释这些截止?如果标准允许这种捕获,它们如何定义它?
GCC 7.2 …
特定
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) 我阅读了关于在PostgreSQL中授予序列的答案.一般来说,他们说同时授予SELECT,USAGE.我想知道我是否只能授予使用权.哪一个是授予序列的最佳实践,为什么?
执行C++20的严格别名规则 [basic.lval] / 11任意允许下...
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)
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)
uint16_t*,uint_least16_t*和char16_t*vector<uint16_t> ui16vec = { 0x007a, …Run Code Online (Sandbox Code Playgroud) 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>完美转发使用通用/转发引用声明的输入参数?
*&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) 这个想法是,我想收集的返回的值double成一个矢量寄存器,用于机加工imm width在一个时间而不第一存储回到存储器。
特定的处理vfma与其他两个操作数都是constexpr,因此它们可以简单地由_mm256_setr_pd调用或从 中对齐/未对齐的内存加载constexpr array。
有没有办法%ymm直接从 value in 中将double 存储在特定位置以%rax进行收集?
目标机器是 Kaby Lake。更有效的未来向量指令也是受欢迎的。
c++ ×7
c++23 ×2
arrays ×1
auto ×1
avx ×1
c++11 ×1
c++17 ×1
c++20 ×1
clang ×1
gcc ×1
intrinsics ×1
postgresql ×1
range-v3 ×1
type-traits ×1
x86-64 ×1