Questions tagged «c++17»

C ++ 17是2017年批准的C ++标准的名称。它以以前的C ++ 14标准为基础,改进了核心语言和标准库,并添加了一些新的语言功能。

2
不推荐使用std :: iterator的准备
3月21日,标准委员会投票通过了弃用P0174中std::iterator提议的建议: 与读者typedef在类定义本身中简单地提供期望的s相比,冗长的void参数序列对读者而言并不十分清楚,这是当前工作草案采用的方法,遵循的c + + 14 之前 C ++ 17std::iterator鼓励从继承继承,以从迭代器样板实现中删除乏味。但是弃用将需要以下其中一项: 迭代器样板现在将需要包含所有必需的typedefs 使用迭代器的算法现在将需要使用auto而不是依赖迭代器来声明类型 Loki Astari建议在std::iterator_traits不继承的情况下进行更新以使其正常工作std::iterator 在设计自定义迭代器时,有人可以启发我应该选择哪些选项吗? C ++ 17 兼容性?

1
为什么不支持串联std :: string和std :: string_view?
从C ++ 17开始,我们可以std::string_view轻松查看连续的字符序列,从而避免了不必要的数据复制。const std::string&现在通常建议使用而不是有参数来代替std::string_view。 但是,人们很快发现,从切换const std::string&到std::string_view使用字符串连接的代码会中断,因为不支持连接std::string和std::string_view: std::string{"abc"} + std::string_view{"def"}; // ill-formed (fails to compile) std::string_view{"abc"} + std::string{"def"}; // ill-formed (fails to compile) 为什么要为串联不支持std::string和std::string_view标准?

2
C ++ 17中新的基于范围的for循环如何帮助Ranges TS?
该委员会将基于范围的for循环从: C ++ 11: { auto && __range = range_expression ; for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin) { range_declaration = *__begin; loop_statement } } 到C ++ 17: { auto && __range = range_expression ; auto __begin = begin_expr ; auto __end = end_expr ; …
71 c++  c++11  for-loop  c++17 

3
C ++函数中“返回”的确切时刻
这似乎是一个愚蠢的问题,但是return xxx;在一个函数中明确定义“执行”的确切时间吗? 请参见以下示例,以了解我的意思(此处直播): #include <iostream> #include <string> #include <utility> //changes the value of the underlying buffer //when destructed class Writer{ public: std::string &s; Writer(std::string &s_):s(s_){} ~Writer(){ s+="B"; } }; std::string make_string_ok(){ std::string res("A"); Writer w(res); return res; } int main() { std::cout<<make_string_ok()<<std::endl; } 我天真地希望发生的事情make_string_ok称为: 的构造函数res称为(值为resis "A") 的构造函数w称为 return res被执行。应该返回res的当前值(通过复制的当前值res),即"A"。 的析构函数 …

4
为什么构造std :: optional <int>比std :: pair <int,bool>昂贵?
考虑以下两种可以表示“可选int”的方法: using std_optional_int = std::optional&lt;int&gt;; using my_optional_int = std::pair&lt;int, bool&gt;; 鉴于这两个功能... auto get_std_optional_int() -&gt; std_optional_int { return {42}; } auto get_my_optional() -&gt; my_optional_int { return {42, true}; } ... g ++干线和clang ++干线 (带有-std=c++17 -Ofast -fno-exceptions -fno-rtti)都会产生以下汇编: get_std_optional_int(): mov rax, rdi mov DWORD PTR [rdi], 42 mov BYTE PTR [rdi+4], 1 …

4
C ++ 17:打开元组时仅保留一些成员
假设您需要调用以下方法: std::tuple&lt;int, int, int&gt; foo(); 在C ++ 17中,您可以调用该函数并在一行中解压缩该元组: auto [a, b, c] = foo(); 现在,我怎么能继续只存储b和c并丢弃a? 目前,我只知道两个选择: 1-自动解压缩时可以使用虚拟变量 但是,哑变量将不被使用,并且会发出警告,因此,如果我想使该警告保持沉默,该代码将非常令人讨厌: #pragma warning(push) #pragma warning(disable:4101) // ReSharper disable once CppDeclaratorNeverUsed auto [_, b, c] = foo(); #pragma warning(pop) 2-我可以存储整个元组,并用于std::get检索对我唯一需要的变量的引用。该代码不太令人讨厌,但语法也不太简单。 此外,对于我们要保留在元组中的每个新值,此代码的大小增加一行。 auto tuple = foo(); int b = std::get&lt;1&gt;(tuple); int c = std::get&lt;2&gt;(tuple); 是否存在另一种更直接的方法来仅将元组中的某些参数解包?
69 c++  tuples  c++17 

3
不建议使用的标头<codecvt>替换
有点前景:我的任务需要将UTF-8 XML文件转换为UTF-16(当然具有正确的标头)。因此,我搜索了将UTF-8转换为UTF-16的常用方法,发现应该使用中的模板&lt;codecvt&gt;。 但是,现在不赞成使用它,我想知道执行相同任务的新通用方法是什么? (完全不介意使用Boost,但除此之外,我更喜欢尽可能接近标准库。)
69 c++  utf-8  c++17  utf-16  codecvt 

5
如何在Lambda本身中获取C ++ Lambda函数的地址?
我试图弄清楚如何获取自身内部的lambda函数的地址。这是一个示例代码: []() { std::cout &lt;&lt; "Address of this lambda function is =&gt; " &lt;&lt; ???? }(); 我知道我可以在变量中捕获lambda并打印地址,但是我想在执行此匿名函数时就地执行该操作。 有没有更简单的方法?
53 c++  c++11  lambda  c++14  c++17 

2
为什么remove_reference在函数上不起作用?
前几天进行一些模板元编程时遇到了奇怪的事情。基本上可以归结为这个断言没有(正如我期望的那样)通过。 static_assert(std::is_same_v&lt;void(), std::remove_reference_t&lt;void()&amp;&gt;&gt;); 起初我以为我在定义函数引用时犯了语法错误,但是这个断言通过了,表明事实并非如此。 static_assert(std::is_same_v&lt;void()&amp;, void()&amp;&gt;); 我还尝试实现remove_reference自己从cppreference复制源,但这也不起作用。这里发生了什么?
38 c++  templates  types  c++17 



1
类无法访问其自己的私有静态constexpr方法-lang虫?
这段代码不能在Clang(6,7,8,9,trunk)中进行编译,但是在GCC(7.1、8.1、9.1)中可以很好地进行编译: template&lt;class T&gt; struct TypeHolder { using type = T; }; template&lt;int i&gt; class Outer { private: template&lt;class T&gt; static constexpr auto compute_type() { if constexpr (i == 42) { return TypeHolder&lt;bool&gt;{}; } else { return TypeHolder&lt;T&gt;{}; } } public: template&lt;class T&gt; using TheType = typename decltype(Outer&lt;i&gt;::compute_type&lt;T&gt;())::type; }; int main() …

3
为什么选择这种转换运算符的重载?
考虑下面的代码。 struct any { template &lt;typename T&gt; operator T &amp;&amp;() const; template &lt;typename T&gt; operator T &amp;() const; }; int main() { int a = any{}; } 此处,第二个转换运算符由过载分辨率选择。为什么? 据我了解,这两个运算符分别推导为operator int &amp;&amp;() const和operator int &amp;() const。两者都在可行的功能集中。通读[over.match.best]并没有帮助我弄清楚为什么后者更好。 为什么后一种功能比前一种更好?

3
如何在C ++中创建类型列表的笛卡尔乘积方法?
自我解释。 基本上说我有这样的类型列表: using type_list_1 = type_list&lt;int, somestructA&gt;; using type_list_2 = type_list&lt;somestructB&gt;; using type_list_3 = type_list&lt;double, short&gt;; 它们可以是各种类型的类型列表。 如何获得笛卡尔积的类型列表? result = type_list&lt; type_list&lt;int, somestructB, double&gt;, type_list&lt;int, somestructB, short&gt;, type_list&lt;somestructA, somestructB, double&gt;, type_list&lt;somestructA, somestructB, short&gt; &gt;; 我确实涉足如何创建如下所示的双向笛卡尔乘积:如何创建类型列表的笛卡尔乘积?,但n方法似乎并不那么琐碎。 现在我正在尝试... template &lt;typename...&gt; struct type_list{}; // To concatenate template &lt;typename... Ts, typename... Us&gt; constexpr auto …


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.