Questions tagged «c++17»

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


5
为什么不能检索变体的索引并使用它来获取其内容?
我正在尝试访问变体的内容。我不知道里面有什么,但值得庆幸的是,变体确实可以。所以我想我只想问问变体它在什么索引上,然后将该索引用于std::get它的内容。 但这不能编译: #include <variant> int main() { std::variant<int, float, char> var { 42.0F }; const std::size_t idx = var.index(); auto res = std::get<idx>(var); return 0; } 错误发生在std::get呼叫中: error: no matching function for call to ‘get<idx>(std::variant<int, float, char>&)’ auto res = std::get<idx>(var); ^ In file included from /usr/include/c++/8/variant:37, from main.cpp:1: /usr/include/c++/8/utility:216:5: …
10 c++  c++17  variant 

2
在只读情况下,什么时候需要空终止的字符串?
我一直在研究该std::string_view库,并且一直在考虑更改我一直在努力使用的代码库std::string_view。但是,在我阅读过的许多主题中,有关何时何地使用std::string_view而不是的主题const std::string &。我已经看到许多答案说:“何时不需要以null结尾的字符串。” 因此,当我开始在网上搜索“何时需要以null结尾的字符串?” 在这个问题上,我还没有真正有用的答案。 我可以想到一个外部库的示例,您需要链接到该外部库std::string。在那种情况下,您将需要一个以null结尾的字符串,因为该库需要它。我想另一个例子是,如果您需要修改字符串本身,但是const &如果我们需要修改它,那么我们就不会通过。 那么什么时候需要使用以null结尾的字符串? 我看过的链接: std :: string_view比const std :: string&到底有多快? 什么时候可以传递const&std :: string而不是std :: string_view? 为什么只有字符串视图? 在C ++ 17中使用const std :: string&参数是否有意义?

2
链接时如何取消副本?
我正在创建一个链接类型的类,例如下面的小示例。似乎在链接成员函数时,将调用复制构造函数。有没有办法摆脱复制构造函数调用?在下面的玩具示例中,很明显,我只在处理临时工,因此“应该”(也许不是按标准,而是从逻辑上)是一种省略。复制省略的第二个最佳选择是调用move构造函数,但事实并非如此。 class test_class { private: int i = 5; public: test_class(int i) : i(i) {} test_class(const test_class& t) { i = t.i; std::cout << "Copy constructor"<< std::endl; } test_class(test_class&& t) { i = t.i; std::cout << "Move constructor"<< std::endl; } auto& increment(){ i++; return *this; } }; int main() { …
10 c++  c++14  c++17 


2
调用伪析构函数以获取浮点常量的有效语法
考虑下面的演示程序。 #include <iostream> int main() { typedef float T; 0.f.T::~T(); } 该程序由编译Microsoft Visual Studio Community 2019。 但是clang并gcc发出这样的错误 prog.cc:7:5: error: unable to find numeric literal operator 'operator""f.T' 7 | 0.f.T::~T(); | ^~~~~ 如果要像这样写表达式,( 0.f ).T::~T()则所有三个编译器都将编译该程序。 因此出现一个问题:此记录在0.f.T::~T()语法上是否有效?如果没有,那么什么语法规则就被打破了?

2
在程序员一级使用C ++ std :: atomic可以保证什么?
我已经听过并阅读了有关的几篇文章,演讲和stackoverflow问题std::atomic,并且我想确保自己已经很好地理解了。由于MESI(或派生的)高速缓存一致性协议,存储缓冲区,使队列无效等可能存在延迟,因此我仍然对高速缓存行的可见性感到困惑。 我读到x86具有更强的内存模型,并且如果缓存失效被延迟,x86可以还原启动的操作。但是我现在只对我作为独立于平台的C ++程序员应该承担的兴趣感兴趣。 [T1:线程1 T2:线程2 V1:共享原子变量] 我了解std :: atomic可以保证, (1)在变量上不发生数据争用(由于对缓存行的独占访问)。 (2)取决于我们使用哪种memory_order,它(在有障碍的情况下)保证发生顺序一致性(在障碍之前,之后或之后)。 (3)在T1上执行原子write(V1)之后,T2上的原子RMW(V1)将是连贯的(其缓存行将已用T1上的写入值进行更新)。 但是正如缓存一致性入门所述, 所有这些事情的含义是,默认情况下,加载可以获取过时的数据(如果相应的失效请求位于失效队列中) 那么,以下正确吗? (4)std::atomic不保证T2在T1上执行原子write(V)之后不会读取原子read(V)上的“陈旧”值。 问题(4)是否正确:如果无论延迟如何,在T1上进行原子写入都会使高速缓存行无效,那么当原子RMW操作而不是在原子读取上进行操作时,T2为什么要等待无效生效? 问题(4)是否错误:线程何时可以在执行过程中读取“过时”值并且“可见”? 非常感谢您的回答 更新1 所以看来我在(3)上错了。想象以下交织,初始V1 = 0: T1: W(1) T2: R(0) M(++) W(1) 即使在这种情况下,保证T2的RMW完全在W(1)之后发生,它仍然可以读取“过时的”值(我错了)。据此,atomic不能保证完全的缓存一致性,而只能保证顺序一致性。 更新2 (5)现在想象这个例子(x = y = 0并且是原子的): T1: x = 1; T2: y = 1; T3: if (x==1 && y==0) print("msg"); …

1
运算符new的执行顺序和构造函数的参数
C ++规范是否指定in 的顺序operator new和构造函数。 g ++的顺序为-> -> ,而clang ++ 的顺序为-> -> 。 差异是由未指定的行为引起的吗?Anew C(A())A()newC()newA()C() g ++:7.4.0 clang ++:10.0.0 #include <iostream> #include <cstdlib> struct A { A() { std::cout << "call A()\n"; } }; struct C { C(A) { std::cout << "call S()\n"; } void *operator new(size_t s) { std::cout << …
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.