Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。

1
'auto'作为函数参数的模板参数占位符
C ++ 20允许使用auto函数参数类型。 它是否还允许将函数参数类型auto用作模板参数占位符(不相似,但以C ++ 17 template <auto>的精神)。 因此,以下代码是C ++ 20之前的版本: template<typename First, typename Second> void printPair(const std::pair<First, Second>& p) { std::cout << p.first << ", " << p.second; } 可以写成: void printPair(const std::pair<auto, auto>& p) { std::cout << p.first << ", " << p.second; } 它确实可以编译,并且可以很好地与实验性GCC实现概念配合使用。 它是C ++ 20的合法语法吗?
22 c++  templates  auto  c++20 

1
在自己的初始化器中使用变量
C ++ 20标准草案的[basic.scope.pdecl] / 1在注释中具有以下(非规范性)示例(合并请求3580之前的部分引号,请参见此问题的答案): unsigned char x = x; x使用其自己的(不确定的)值初始化。 这实际上在C ++ 20中具有明确定义的行为吗? 通常T x = x;,由于在初始化完成之前x的值是不确定的,因此表单的自我初始化具有未定义的行为。评估不确定值通常会导致未定义的行为([basic.indent] / 2),但是[basic.indent] /2.3中有一个特定的例外,该例外允许直接unsigned char从unsigned char具有不确定值的左值初始化变量(导致使用不确定值进行初始化) )。 这本身并不会因此导致不确定的行为,但会为其他类型T不属于无符号窄字符类型或std::byte如int x = x;。这些注意事项同样适用于C ++ 17及之前的版本,另请参见底部的链接问题。 但是,即使对于unsigned char x = x;,当前草案的[basic.lifetime] / 7也表示: 类似地,使用不依赖于其值的glvalue的属性,在其生命周期开始之前已得到明确定义。该程序在以下情况下具有未定义的行为: glvalue用于访问对象,或者 [...] 这似乎暗示x示例中的值只能在其生命周期内使用。 [basic.lifetime] / 1说: [...] 类型为T的对象的生存期始于以下情况: [...]和 它的初始化(如果有的话)已经完成(包括真空初始化)([dcl.init]), [...] 因此,x仅在初始化完成后才开始生命周期。但是在引用的示例中,x在x初始化完成之前使用的值。因此,使用具有未定义的行为。 …

6
通过C ++中的重载构造函数初始化未知类型的变量
来自主要来自python的背景,我在使用C ++类型方面有些挣扎。 我试图通过几个采用不同类型作为参数的重载构造函数之一来初始化类变量。我已经读到使用auto关键字可以用于变量的自动声明,但是在我的情况下,直到选择构造函数后,它才会被初始化。但是,编译器对不初始化并不满意value。 class Token { public: auto value; Token(int ivalue) { value = ivalue; } Token(float fvalue) { value = fvalue; } Token(std::string svalue) { value = svalue; } void printValue() { std::cout << "The token value is: " << value << std::endl; } }; 在python中,它可能看起来像: class Token(): def …


2
是POD类型完全等同于琐碎的标准布局类型吗?
在C ++ 20中,不赞成使用POD的概念,因为它是琐碎且标准的布局的无意义的合成特征。但是,C ++ 20草案中POD的定义并不完全是“琐碎的和标准布局”;实际上是: POD类是既是普通类又是标准布局类的类,并且不具有非POD类类型的非静态数据成员(或其数组)。POD类型是标量类型,POD类,此类数组或这些类型之一的cv限定版本。 换句话说,POD类型不仅是琐碎的而且是标准布局的,而且也是递归的。 该递归需求是否多余?换句话说,如果一个类型既是琐碎的又是标准布局,那么它是否也自动递归地变得琐碎又是标准布局?如果答案为“否”,那么标准布局,琐碎类型却无法成为POD的例子是什么?

2
零长度数组的指针的属性
考虑 int main() { auto a = new int[0]; delete[] a; // So there's no memory leak } 在复制初始化和删除之间,是否允许您读取处的指针a + 1? 此外,该语言是否允许编译器设置a为nullptr?

2
实际上,一个<random>随机数引擎中应该使用哪个?std :: mt19937?
假设您想&lt;random&gt;在实际程序中使用C ++ 工具(对于“实际”的某些定义-这里的约束是该问题的一部分)。您的代码大致如下: int main(int argc, char **argv) { int seed = get_user_provided_seed_value(argc, argv); if (seed == 0) seed = std::random_device()(); ENGINE g(seed); // TODO: proper seeding? go_on_and_use(g); } 我的问题是,您应该使用哪种类型ENGINE? 我以前经常说std::mt19937,是因为它可以快速键入并具有名称识别功能。但是这些天来,似乎每个人都在说 Mersenne Twister非常重且对缓存不友好,甚至没有通过其他人所做的所有统计测试。 我想说,std::default_random_engine因为这是显而易见的“默认值”。但是我不知道它在平台之间是否有所不同,并且我也不知道它在统计上是否有好处。 既然如今每个人都在64位平台上,我们至少应该使用std::mt19937_64over std::mt19937吗? 我想说pcg64还是xoroshiro128因为它们看起来受人尊敬且轻巧,但它们根本不存在&lt;random&gt;。 我不知道什么minstd_rand,minstd_rand0,ranlux24,knuth_b,等-当然,他们一定是好东西? 显然,这里存在一些竞争约束。 发动机强度。(&lt;random&gt;没有加密强度高的PRNG,但是,某些标准化的PRNG比其他的“弱”,对吧?) sizeof 引擎。 其速度operator()。 易于播种。mt19937众所周知,很难正确地植入种子,因为它有太多的状态要初始化。 库供应商之间的可移植性。如果一个供应商提供的foo_engine编号与另一供应商提供的编号不同foo_engine,则对某些应用程序不利。(希望这不排除任何可能,除非default_random_engine。) 尽可能权衡所有这些限制,您将说出最终的“最佳实践留在标准库中”的答案是什么?我应该继续使用std::mt19937还是什么?
21 c++  c++11  random 

4
不允许隐式转换返回
#include &lt;optional&gt; bool f() { std::optional&lt;int&gt; opt; return opt; } 无法编译: 'return': cannot convert from 'std::optional&lt;int&gt;' to 'bool' 咨询参考本来可以找到解释的,但我读了应该可以。 每当在上下文中使用某种类型T1的表达式但不接受该类型但接受某种其他类型的T2时,都会执行隐式转换。特别是: 当调用以T2作为参数声明的函数时,将表达式用作参数时; 当表达式用作期望T2的运算符的操作数时; 初始化类型为T2的新对象时,包括返回T2的函数中的return语句; 当在switch语句中使用该表达式时(T2是整数类型); 在if语句或循环中使用该表达式时(T2为bool)。

4
如何调用模板类型的正确构造函数?
在以下代码中,如何使注释行与其上方的行一样工作? 我想将其设为通用代码,以调用合适的template构造函数Type。 #include &lt;string&gt; #include &lt;iostream&gt; template &lt;typename Type&gt; struct Class { Type data; Class(Type data) : data(data) { } }; int main() { Class&lt;std::string&gt; a = std::string("abc"); // Class&lt;std::string&gt; b = "abc"; std::cout &lt;&lt; a.data &lt;&lt; std::endl; return 0; }

5
在C ++中设置操作(更新现有值)
这是我的代码: while (it!=s.end()) //here 's' is a set of stl and 'it' is iterator of set { *it=*it-sub; //'sub' is an int value it++; } 我无法更新迭代器的set值。我想从集合的所有元素中减去一个整数值“ sub”。 谁能帮助我实际的问题所在,实际的解决方案是什么? 这是错误消息: error: assignment of read-only location ‘it.std::_Rb_tree_const_iterator&lt;int&gt;::operator*()’ 28 | *it=*it-sub; | ~~~^~~~~~~~
21 c++ 

1
为什么GCC聚合数组的初始化会首先用零填充整个东西,包括非零元素?
为什么gcc用零而不是仅剩余的96个整数填充整个数组?非零初始值设定项都在数组的开头。 void *sink; void bar() { int a[100]{1,2,3,4}; sink = a; // a escapes the function asm("":::"memory"); // and compiler memory barrier // forces the compiler to materialize a[] in memory instead of optimizing away } MinGW8.1和gcc9.2都使asm像这样(Godbolt编译器资源管理器)。 # gcc9.2 -O3 -m32 -mno-sse bar(): push edi # save call-preserved EDI which …


1
产生线程是否自己提供内存顺序保证?
我想大致这样做: 初始线程: 向全局变量写入一些值(它们将不再被写入) 这可能是中等大小的数据(数组,字符串等)。无法简单地制造std::atomic&lt;&gt;。 产生其他线程 其他线程: 读取全局状态 做工作等 现在,我知道可以将参数传递给std::thread,但是我试图通过此示例理解C ++的内存保证。 另外,我非常有信心,在任何实际的实现中,创建线程都会造成内存障碍,从而确保线程可以“看到”父线程在此之前编写的所有内容。 但是我的问题是:这是否由标准保证? 另外:我想我可以添加一些虚拟对象std::atomic&lt;int&gt;,然后在启动其他线程之前写入该虚拟对象,然后在其他线程上,在启动时读取一次。我相信所有发生的事情都会确保之前编写的全局状态正确可见。 但是我的问题是,技术上是否需要类似的东西,或者线程创建是否足够?

1
为什么{}作为函数参数不会导致歧义?
考虑以下代码: #include &lt;vector&gt; #include &lt;iostream&gt; enum class A { X, Y }; struct Test { Test(const std::vector&lt;double&gt;&amp;, const std::vector&lt;int&gt;&amp; = {}, A = A::X) { std::cout &lt;&lt; "vector overload" &lt;&lt; std::endl; } Test(const std::vector&lt;double&gt;&amp;, int, A = A::X) { std::cout &lt;&lt; "int overload" &lt;&lt; std::endl; } }; int main() { …

3
通过给定条件拆分给定的std :: variant类型
如何通过给定的变体类型 using V = std::variant&lt;bool, char, std::string, int, float, double, std::vector&lt;int&gt;&gt;; 声明两个变体类型 using V1 = std::variant&lt;bool, char, int, float, double&gt;; using V2 = std::variant&lt;std::string, std::vector&lt;int&gt;&gt;; 其中V1包括来自的所有算术类型,V并V2包括来自的所有非算术类型V? V 可以是模板类的参数,例如: template &lt;class V&gt; struct TheAnswer { using V1 = ?; using V2 = ?; }; 通常,条件可以是这样的constexpr变量: template &lt;class T&gt; constexpr bool filter;
20 c++  c++17  std-variant 

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.