Questions tagged «c++20»

C ++ 20是C ++ 17之后的C ++版本的目标。对于与C ++ 20有关的C ++功能,应使用此标签(与C ++标签一起使用)。

1
如果constexpr-为什么要完全检查废弃的语句?
我在GCC 10中搞乱了c ++ 20 consteval并编写了这段代码 #include <optional> #include <tuple> #include <iostream> template <std::size_t N, typename Predicate, typename Tuple> consteval std::optional<std::size_t> find_if_impl(Predicate&& pred, Tuple&& t) noexcept { constexpr std::size_t I = std::tuple_size_v<std::decay_t<decltype(t)>> - N; if constexpr (N == 0u) { return std::nullopt; } else { return pred(std::get<I>(t)) ? std::make_optional(I) : find_if_impl<N …

3
std :: bit_cast与std :: array
Timur Doumler 在他最近的演讲“现代C ++中的类型修剪”中说,由于不能从函数返回C样式的数组,std::bit_cast因此不能用于将a 强制float转换unsigned char[4]为a。我们应该使用std::memcpy或等到C ++ 23(或更高版本)后,类似的东西reinterpret_cast<unsigned char*>(&f)[i]才能很好地定义。 在C ++ 20中,我们可以在中std::array使用std::bit_cast, float f = /* some value */; auto bits = std::bit_cast<std::array<unsigned char, sizeof(float)>>(f); 而不是C样式的数组来获取float?的字节?

1
为什么表达式类型在C ++中的版本之间会发生变化?
我尝试理解C ++的表达式类型,我读的越多,我就越困惑,因为我发现C ++草案很难理解,因此倾向于使用其他资源,但是它们彼此矛盾,或者没有考虑到C ++版本之间的措辞和定义有很大的变化。 在下文中,我指的是以下草案: C ++ 11 [ n3690 ](最终草案) C ++ 17 [ n4659 ](最终草案) C ++ 20 [ n4835 ](当前草案) C++11 3.10左值和右值 ... prvalue(“纯” rvalue)是不是xvalue的rvalue。[示例:调用返回类型不是引用的函数的结果是prvalue。文字的值(例如12、7.3e5或true)也是prvalue。—结束示例] C++17 3.10左值和右值 ... prvalue是一个表达式,其求值初始化一个对象或位域,或计算一个运算符的操作数的值,该值由其出现的上下文指定。 C++20 7.2.1值类别* ... prvalue是一个表达式,其求值初始化一个对象或位字段,或者计算一个运算符的操作数(由其出现的上下文指定),或者是cv void类型的表达式。 我会理解措词的更改,并进行了一些调整,但对我而言,整个定义都会更改。有人可以帮我理解吗?例如,为什么删除了一个句子,即prvalue是不是xvalue的rvalue?还是为什么删除了有用的示例?
13 c++  c++11  c++14  c++17  c++20 

1
`equality_comparable_with`是否需要要求`common_reference`?
的概念equality_­comparable_with<T, U>旨在声明类型的对象T和U可比较彼此相等,而如果是这样,则这具有预期含义。没关系。 但是,这个概念也必须common_reference_t<T&, U&>存在。对于主要推动力common_reference和随之而来的功能似乎是启用代理迭代器,有代表之间的关系的地方reference,并value_type为这样的迭代器。 太好了,但是...与a T和a是否U可以彼此相等进行测试有什么关系?为什么标准要求这样做T并U具有共同的引用关系,以使您可以比较它们相等? 这就产生了奇怪的情况,在这种情况下,很难拥有两种在逻辑上不具有合理可比性的公共参照关系的类型。例如,vector<int>并且pmr::vector<int>在逻辑上应该是可比较的。但是它们之所以不可以,是因为这两个原本不相关的类型之间没有合理的公共引用。

1
模板类中的C ++ 20类外定义
直到C ++的C ++ 20标准,当我们想定义一个使用模板类的一些私有成员的类外运算符时,我们将使用类似于以下的构造: template <typename T> class Foo; template <typename T> constexpr bool operator==(T lhs, const Foo<T>& rhs); template <typename T> class Foo { public: constexpr Foo(T k) : mK(k) {} constexpr friend bool operator==<T>(T lhs, const Foo& rhs); private: T mK; }; template <typename T> constexpr bool operator==(T …
12 c++  templates  c++20 

1
标准是否保证无捕获的lambda为空?
我正在寻找一种从模板函数中的其他lambda识别空(无捕获)lambda的方法。我目前正在使用C ++ 17,但我也对C ++ 20的答案感到好奇。 我的代码如下所示: template<typename T> auto func(T lambda) { // The aguments of the lambdas are unknown if constexpr (/* is captureless */) { // do stuff } } C ++标准(17或20)是否保证可转换为函数指针的不可捕获lambda也会使std::is_emptyyield 变为true? 以以下代码为例: auto a = []{}; // captureless auto b = [c = 'z']{}; // has …
12 c++  lambda  c++17  c++20 

1
是什么防止班级中相邻成员的重叠?
考虑以下三个struct: class blub { int i; char c; blub(const blub&) {} }; class blob { char s; blob(const blob&) {} }; struct bla { blub b0; blob b1; }; 在int4字节的典型平台上,大小,对齐方式和总填充1如下: struct size alignment padding -------- ------ ----------- --------- blub 8 4 3 blob 1 1 0 bla 12 4 6 …

1
Linux软件包管理器将如何处理C ++ 20模块?
我们到了2020年,C ++ 20以及期待已久的C ++模块功能将面世。但是,在观看了有关CppCon的一些讨论之后,我发现C ++模块处在一个奇怪的地方,特别是对于Linux软件包管理器(pacman,apt,emerge等)。 据我了解,C ++模块是 依赖编译器 您不能在Clang中使用GCC构建的模块 GCC 9.1模块在GCC 9.2上不起作用 同一模块可以有许多不同版本 只要它们不导出到相同的作用域 如果依赖关系更新,则需要重建模块 我的问题是,在所有发行发行版的发行版中,编译器一直都在更新,并且用户可能拥有自己的编译器版本。目前,人们可以只更新编译器,也可以更新libstdc++。但是对于模块,似乎建议libstdc++必须在编译器更新时进行更新。 当编译器更新时,包管理器将如何处理更新,例如STL?我认为为编译器的每个版本构建STL模块的每个版本都是不可行的。用户也不必构建自己的STL模块是一个好主意。

2
将概念传递给功能
由于将概念定义为编译时谓词,是否还可以将这些谓词实际重用于编译时算法?例如,可以检查元组中的所有类型是否都符合概念?据我所知,不可能以任何方式将概念传递给函数,这使我重新回到在这些情况下使用模板。 #include <type_traits> template<typename T> concept FloatLike = std::is_same_v<T, float>; struct IsFloat { template<typename U> constexpr static bool test() { return FloatLike<U>; } }; template<typename Predicate, typename... T> constexpr bool all_types() { return (Predicate::template test<T>() && ...); } int main() { static_assert(all_types<IsFloat, float, float>()); static_assert(!all_types<IsFloat, float, int>()); } 我想做的就是这样,所以我不必一直包装这个概念就可以使用它: template<concept …


4
使用非布尔返回值重载相等比较时,C ++ 20中的更改中断还是clang-trunk / gcc-trunk中的回归?
以下代码在c ++ 17模式下使用clang-trunk可以正常编译,但在c ++ 2a(即将到来的c ++ 20)模式下可以中断: // Meta struct describing the result of a comparison struct Meta {}; struct Foo { Meta operator==(const Foo&) {return Meta{};} Meta operator!=(const Foo&) {return Meta{};} }; int main() { Meta res = (Foo{} != Foo{}); } 它还可以使用gcc-trunk或clang-9.0.0进行编译:https : //godbolt.org/z/8GGT78 clang-trunk和错误-std=c++2a: <source>:12:19: error: use …

1
可以是constexpr吗?
所有std :: span的构造函数都声明为constexpr,但是我似乎无法在constexpr上下文中使用它们中的任何一个。取消注释以下任何constexpr都将导致编译错误。 #include <array> #include <span> int main() { constexpr int carray[3] = { 0, 1, 2 }; constexpr std::array<int, 3> array{ 0, 1, 2 }; using S = std::span<const int, 3>; /*constexpr*/ S span1{ array.data(), 3 }; /*constexpr*/ S span2{array.begin(), array.end()}; /*constexpr*/ S span3{carray}; /*constexpr*/ S span4{array}; } …
11 c++  constexpr  c++20 

1
为什么std :: span缺少比较运算符?
std::span设计不是作为对std::vector/ std::array/ 普通数组等子区域的轻量级引用吗?它是否不应该在其API中也包含比较运算符,以便与它们保持一致?排除在外的原因是什么? 注:通过比较操作,我的意思是无论是全套(<,<=,...),或者太空飞船<=>
10 c++  std  c++20  std-span 

1
自C ++ 20起允许在分配的存储上使用指针算术吗?
在C ++ 20标准中,据说数组类型是隐式生存期类型。 这是否意味着可以隐式创建非隐式生命周期类型的数组?这样的数组的隐式创建会不会导致创建数组的元素? 考虑这种情况: //implicit creation of an array of std::string //but not the std::string elements: void * ptr = operator new(sizeof (std::string) * 10); //use launder to get a "pointer to object" (which object?) std::string * sptr = std::launder(static_cast<std::string*>(ptr)); //pointer arithmetic on not created array elements well defined? …

1
我们将能够使用C ++ 20构建具有视图的容器吗?
C ++ 20标准版本将范围引入C ++。 我的问题:我们能否构造(现有)任何范围的标准库容器?更重要的是,具有范围视图吗? 例如,这将: #include <vector> #include <iostream> #include <ranges> int main() { auto sq = [](int x) { return x * x; }; std::vector<int> vec { 3, 4, 5 }; std::vector<int> squares { std::ranges::views::transform(vec, sq) }; for(auto i : squares) { std::cout << i << ' '; …
10 c++  c++20  range-v3 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.