Questions tagged «c++»

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

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


4
如果指令宏比较
为什么#if以下代码中的条件得到满足: #include <iostream> #define VALUE foo int main() { #if VALUE == bar std::cout << "WORKS!" << std::endl; #endif // VALUE }

4
具有特定类型作为通用参数的STL容器
有什么办法可以使函数将具有特定类型(让我们说std::string)的容器作为参数? void foo(const std::container<std::string> &cont) { for(std::string val: cont) { std::cout << val << std::endl; } } 并为每种类型的stl容器调用它作为输入?喜欢上面吗? std::set<std::string> strset; std::vector<std::string> strvec; std::list<std::string> strlist; foo(strset); foo(strvec); foo(strlist);


2
std :: unordered_map运算符[]是否对不存在的密钥进行零初始化?
根据cppreference.com,std::map::operator[]对于不存在的值进行零初始化。 但是,同一站点没有提及的零初始化std::unordered_map::operator[],但确实有一个依赖于此的示例。 当然,这只是参考站点,而不是标准站点。那么,下面的代码是否正确? #include <unordered_map> int main() { std::unordered_map<int, int> map; return map[42]; // is this guaranteed to return 0? }

2
C ++ 20中的指定初始值设定项
我对c ++ 20功能之一(指定的初始化程序)有疑问(有关此功能的更多信息,请点击此处) #include <iostream> constexpr unsigned DEFAULT_SALARY {10000}; struct Person { std::string name{}; std::string surname{}; unsigned age{}; }; struct Employee : Person { unsigned salary{DEFAULT_SALARY}; }; int main() { std::cout << std::boolalpha << std::is_aggregate_v<Person> << '\n'; // true is printed std::cout << std::boolalpha << std::is_aggregate_v<Employee> << '\n'; // true …

3
允许编译器对局部volatile进行常量折叠吗?
考虑以下简单代码: void g(); void foo() { volatile bool x = false; if (x) g(); } https://godbolt.org/z/I2kBY7 您可以看到,也gcc没有clang优化对的潜在调用g。在我的理解中,这是正确的:抽象机器假定volatile变量随时可能更改(由于例如被硬件映射),因此将false初始化不断折叠到if检查中将是错误的。 但是MSVC g完全消除了对的调用(保留对文件的读写volatile!)。这是符合标准的行为吗? 背景:我有时会使用这种结构来即时打开/关闭调试输出:编译器必须始终从内存中读取值,因此在调试过程中更改变量/内存应相应地修改控制流。 。MSVC输出确实重新读取了该值,但忽略了该值(可能是由于不断折叠和/或消除了死代码),这当然违背了我的意图。 编辑: volatile此处讨论了对读写的消除:是否允许编译器优化局部volatile变量?(感谢内森!)。我认为该标准非常明确,即必须进行那些读写操作。但是,该讨论并未涵盖编译器将这些读取结果视为理所当然并基于此进行优化是否合法。我想这是标准中未指定的/未指定的,但是如果有人证明我做错了,我会很高兴。 我当然可以制作x一个非局部变量来避免该问题。这个问题更多是出于好奇。

2
内联在模块接口中的含义
考虑头文件: class T { private: int const ID; public: explicit T(int const ID_) noexcept : ID(ID_) {} int GetID() const noexcept { return ID; } }; 或者,或者: class T { private: int const ID; public: explicit T(int const ID_) noexcept; int GetID() const noexcept; }; inline T::T(int const ID_) noexcept …

3
显式(布尔)的用例是什么
C ++ 20引入了显式(布尔),它在编译时有条件地选择是否使构造函数显式。 下面是我在这里找到的示例。 struct foo { // Specify non-integral types (strings, floats, etc.) require explicit construction. template <typename T> explicit(!std::is_integral_v<T>) foo(T) {} }; foo a = 123; // OK foo b = "123"; // ERROR: explicit constructor is not a candidate (explicit specifier evaluates to true) foo c {"123"}; …
24 c++  c++20  explicit 

1
为什么`decltype(static_cast <T>(…))`并不总是`T`?
对于以下代码,除最后一个断言外,所有代码均通过: template&lt;typename T&gt; constexpr void assert_static_cast_identity() { using T_cast = decltype(static_cast&lt;T&gt;(std::declval&lt;T&gt;())); static_assert(std::is_same_v&lt;T_cast, T&gt;); } int main() { assert_static_cast_identity&lt;int&gt;(); assert_static_cast_identity&lt;int&amp;&gt;(); assert_static_cast_identity&lt;int&amp;&amp;&gt;(); // assert_static_cast_identity&lt;int(int)&gt;(); // illegal cast assert_static_cast_identity&lt;int (&amp;)(int)&gt;(); assert_static_cast_identity&lt;int (&amp;&amp;)(int)&gt;(); // static assert fails } 为什么最后一个断言失败,static_cast&lt;T&gt;而不总是返回a T?
24 c++  static-cast 

3
C ++ 20概念:当template参数符合多个概念时,选择哪种模板专业化?
鉴于: #include &lt;concepts&gt; #include &lt;iostream&gt; template&lt;class T&gt; struct wrapper; template&lt;std::signed_integral T&gt; struct wrapper&lt;T&gt; { wrapper() = default; void print() { std::cout &lt;&lt; "signed_integral" &lt;&lt; std::endl; } }; template&lt;std::integral T&gt; struct wrapper&lt;T&gt; { wrapper() = default; void print() { std::cout &lt;&lt; "integral" &lt;&lt; std::endl; } }; int main() { wrapper&lt;int&gt; w; …

2
为什么此模板功能无法正常运行?
我在阅读有关模板函数的信息,并对这个问题感到困惑: #include &lt;iostream&gt; void f(int) { std::cout &lt;&lt; "f(int)\n"; } template&lt;typename T&gt; void g(T val) { std::cout &lt;&lt; typeid(val).name() &lt;&lt; " "; f(val); } void f(double) { std::cout &lt;&lt; "f(double)\n"; } template void g&lt;double&gt;(double); int main() { f(1.0); // f(double) f(1); // f(int) g(1.0); // d f(int), this is surprising …

1
为什么C ++中类的大小取决于数据成员的公共/私有状态?
据我所知,C ++中类的大小取决于以下因素: 所有非静态数据成员的大小。 数据成员的顺序。 是否启用字节填充。 其直接基类的大小。 虚拟功能的存在。 继承方式(虚拟继承)。 现在,我创建了两个类,如下所示: class A{ int a; short s; int b; char d; };// kept a char at last on purpose to leave a "hole" class B : public A{ char c; }; 现在检查A和BI的大小,请参见 A的大小:16 B的大小:16 我的假设是B类中的字符c容纳在A类中剩余的“空洞”中。 但是,令我感到困惑的是以下情况,其中我将成员公开 class A{ public: int a; short …

3
Lambda函数可变捕获从引用到全局变量的行为差异
我发现如果我使用lambda使用mutable关键字捕获对全局变量的引用,然后修改lambda函数中的值,则结果在编译器之间是不同的。 #include &lt;stdio.h&gt; #include &lt;functional&gt; int n = 100; std::function&lt;int()&gt; f() { int &amp;m = n; return [m] () mutable -&gt; int { m += 123; return m; }; } int main() { int x = n; int y = f()(); int z = n; printf("%d %d %d\n", x, y, …

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.