Questions tagged «c++»

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

7
区分两个零参数构造函数的惯用方式
我有这样的课: struct event_counts { uint64_t counts[MAX_COUNTERS]; event_counts() : counts{} {} // more stuff }; 通常我想默认(零)初始化counts数组,如图所示。 但是,在通过性能分析确定的选定位置,我想抑制数组初始化,因为我知道数组即将被覆盖,但是编译器不够聪明,无法弄清楚它。 创建这样的“辅助”零参数构造函数的惯用而有效的方法是什么? 当前,我正在使用uninit_tag作为伪参数传递的标记类,如下所示: struct uninit_tag{}; struct event_counts { uint64_t counts[MAX_COUNTERS]; event_counts() : counts{} {} event_counts(uninit_tag) {} // more stuff }; 然后,像event_counts c(uninit_tag{});想抑制构造时一样,调用no-init构造函数。 我对不涉及创建哑类或以某种方式更有效的解决方案持开放态度。

2
在C ++中实现SFINAE的方法
我在项目中大量使用函数SFINAE,并且不确定以下两种方法(除了样式)是否存在任何差异: #include <cstdlib> #include <type_traits> #include <iostream> template <class T, class = std::enable_if_t<std::is_same_v<T, int>>> void foo() { std::cout << "method 1" << std::endl; } template <class T, std::enable_if_t<std::is_same_v<T, double>>* = 0> void foo() { std::cout << "method 2" << std::endl; } int main() { foo<int>(); foo<double>(); std::cout << "Done..."; std::getchar(); …
40 c++  sfinae 


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

4
模板元编程
有人可以向我解释一下,为什么第一个模板元编程方式将进入无限循环,而第二个模板正确运行。 #include <iostream> using namespace std; template<int N, int M> struct commondivs { static const int val = (N<M) ? commondivs<N,(M-N)>::val : commondivs<(N-M),M>::val; }; template<int N> struct commondivs<N,N> { static const int val = N; }; int commondiv(int N, int M){ if(N==M){ return N; } return (N<M)?commondiv(N,(M-N)):commondiv((N-M),M); } int main() …



4
使用模板重载功能
我正在尝试使用模板定义函数,并且我希望类型名是int或anEnum(我已定义的特定枚举)。我尝试了以下操作,但失败了: template <int | anEnum T> // or <int T, anEnum T> or <int, anEnum T> bool isFunction(const T &aVariable){} 我正在尝试使用模板,而不是定义两个重载函数。我希望函数可以按以下方式调用,而程序员不必考虑类型 isFunction(aVariable) // and not isFunction<int> (aVariable) nor isFunction<anEnum> (aVariable) 基本上,我希望将此函数作为int和aNum类型的模板。我已经搜索过了,但是找不到答案。我可能会缺少什么?谢谢,

3
递增指向0大小的动态数组的指针是否未定义?
AFAIK,尽管我们无法创建大小为0的静态内存数组,但是我们可以使用动态数组来做到这一点: int a[0]{}; // Compile-time error int* p = new int[0]; // Is well-defined 如我所读,p行为就像一个过去的元素。我可以打印p指向的地址。 if(p) cout << p << endl; 尽管我确定我们不能像使用迭代器(过去元素)那样取消引用该指针(过去元素),但是我不确定是否要增加该指针p?是否像迭代器一样具有未定义的行为(UB)? p++; // UB?

2
新分配指向功能的指针合法吗?
函数指针不是纯数据指针,因为它们不能存储在void *指针中。尽管如此,似乎我可以像下面的代码一样将功能指针的副本存储在动态内存中(在gcc和clang中)。根据C ++标准,这样的代码合法吗,或者这是某种编译器扩展? 而且,指向功能指针的结果指针的行为就像普通的数据指针:我可以将其存储在void *中,并通过static_cast从void *中检索它。该行为是否受到标准的保证? int main() { extern void fcn(); void (*fcnPtr)() = &fcn; void (**ptrToFcnPtr)() = nullptr; //Make the copy of fcnPtr on the heap: ptrToFcnPtr = new decltype(fcnPtr)(fcnPtr); //Call the pointed-to function : (**ptrToFcnPtr)(); //Save the pointer in void* : void *ptr = ptrToFcnPtr; //retrieve the …
33 c++ 

2
复制构造函数中的C ++名称空间冲突
我有以下代码: namespace A { struct Foo { int a; }; } struct Foo { int b; }; struct Bar : public A::Foo { Bar(Foo foo) { c = foo.b; } int c; }; C ++编译器抱怨“ c = foo.b”,因为A :: Foo没有名为b的成员。如果我用:: Foo更改Bar参数的类型,它将起作用。 我的问题是此行为背后的原因是什么(我想这与继承使Bar进入A名称空间这一事实有关,但是我找不到任何文档来支持该理论。

3
C ++十进制类型和括号-为什么?
之前已经讨论 过该主题,但这不是重复的。 当有人询问decltype(a)和之间的区别时decltype((a)),通常的答案是- a是变量,(a)是表达式。我觉得这个答案不令人满意。 首先,a也是一个表达。主表达式的选项包括: (表情) id表达 更重要的是,decltype的措词非常非常明确地考虑了括号: For an expression e, the type denoted by decltype(e) is defined as follows: (1.1) if e is an unparenthesized id-expression naming a structured binding, ... (1.2) otherwise, if e is an unparenthesized id-expression naming a non-type template-parameter, ... (1.3) otherwise, if e …

4
为什么两个using子句解析为同一类型在gcc中被认为是模棱两可的
我有两个使用using子句的基类 class MultiCmdQueueCallback { using NetworkPacket = Networking::NetworkPacket; .... } class PlcMsgFactoryImplCallback { using NetworkPacket = Networking::NetworkPacket; .... } 然后我宣布一个课程 class PlcNetwork : public RouterCallback, public PlcMsgFactoryImplCallback, public MultiCmdQueueCallback { private: void sendNetworkPacket(const NetworkPacket &pdu); } 然后,编译器会标记对“ NetworkPacket”的错误引用是模糊的“ sendNetworkPacket(NetworkPacket&...” 现在,两个“ using子句”都解析为相同的基础类Networking:NetworkPacket 实际上,如果我将方法声明替换为: void sendNetworkPacket(const Networking::NetworkPacket &pdu); 它编译良好。 为什么编译器将每个using子句都视为一个不同的类型,即使它们都指向相同的基础类型。这是由标准强制执行的还是我们有编译器错误?

2
添加到std :: vector时类字段的行为异常
在以下情况下,我发现了一些非常奇怪的行为(在clang和GCC上)。我有一个向量,nodes有一个元素,一个class的实例Node。然后,我在上调用一个函数nodes[0],Node以向向量添加新的函数。添加新节点后,将重置调用对象的字段!但是,一旦功能完成,它们似乎又恢复正常。 我相信这是一个最小的可复制示例: #include <iostream> #include <vector> using namespace std; struct Node; vector<Node> nodes; struct Node{ int X; void set(){ X = 3; cout << "Before, X = " << X << endl; nodes.push_back(Node()); cout << "After, X = " << X << endl; } }; int main() { nodes = …

6
缺少的#include是否有可能在运行时中断程序?
是否有任何情况#include会在构建仍然进行的情况下丢失a 并在运行时破坏软件? 换句话说,是否有可能 #include "some/code.h" complexLogic(); cleverAlgorithms(); 和 complexLogic(); cleverAlgorithms(); 会成功构建,但行为会有所不同?
31 c++ 

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.