问题标签 [c++03]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
10 回答
137730 浏览

c++ - 在 C++ 中的类初始化程序中初始化 const 数组

我在 C++ 中有以下类:

问题是,我如何在初始化列表中初始化 b ,因为我无法在构造函数的函数体内初始化它,因为 b 是const

这不起作用:

编辑:典型的例子是我可以b为不同的实例设置不同的值,但已知这些值在实例的生命周期内是恒定的。

0 投票
11 回答
26729 浏览

design-patterns - 您使用的是 C++ 中的哪个类型安全枚举?

众所周知,C++ 中的内置枚举不是类型安全的。我想知道那里使用了哪些实现类型安全枚举的类......我自己使用以下“自行车”,但它有点冗长和有限:

typesafeenum.h:

typesafeenum.cpp:

用法:

补充: 我认为我应该对要求更具体。我将尝试总结它们:

优先级 1:将枚举变量设置为无效值应该是不可能的(编译时错误),没有例外。

优先级 2:应该可以通过单个显式函数/方法调用将枚举值转换为 int。

优先级3:尽可能简洁、优雅、方便的声明和使用

优先级 4:将枚举值与字符串转换。

Priority 5: (Nice to have) Possibility to iterate over enum values.

0 投票
7 回答
9613 浏览

c++ - 并发的 C++03 内存模型是什么?

C++03中并发的内存模型是什么?

(而且,C++11 是否更改了内存模型以更好地支持并发?)

0 投票
9 回答
3031 浏览

c++ - 为什么使用 = 来初始化 C++ 中的原始类型?

在我工作的地方,人们大多认为最好使用 C++ 风格的构造(带括号)初始化对象,而应该使用 = 运算符初始化原始类型:

不过,似乎没有人能够解释为什么他们更喜欢这种方式。我可以看到这std::string = "Foo";将是低效的,因为它会涉及额外的副本,但是=完全消除运算符并在任何地方使用括号有什么问题?

这是一个共同的约定吗?背后的想法是什么?

0 投票
13 回答
147334 浏览

c++ - 如何将类成员函数作为回调传递?

我正在使用一个 API,它要求我将函数指针作为回调传递。我正在尝试在我的课堂上使用这个 API,但我遇到了编译错误。

这是我从构造函数中所做的:

这不会编译 - 我收到以下错误:

错误 8 错误 C3867:'CLoggersInfra::RedundencyManagerCallBack':函数调用缺少参数列表;使用 '&CLoggersInfra::RedundencyManagerCallBack' 创建指向成员的指针

我尝试了使用的建议&CLoggersInfra::RedundencyManagerCallBack- 对我不起作用。

对此有任何建议/解释吗?

我正在使用VS2008。

谢谢!!

0 投票
9 回答
7236 浏览

c++ - 在 C++ 中实现智能指针的最佳方法是什么?

我一直在评估各种智能指针实现(哇,那里有很多),在我看来,它们中的大多数可以分为两大类:

1) 此类别对引用的对象使用继承,以便它们具有引用计数,并且通常实现 up() 和 down()(或它们的等价物)。IE,要使用智能指针,您指向的对象必须从 ref 实现提供的某个类继承。

2) 此类别使用辅助对象来保存引用计数。例如,智能指针不是直接指向一个对象,而是实际上指向这个元数据对象……谁有引用计数和 up() 和 down() 实现(并且谁通常提供指针指向的机制获取指向的实际对象,以便智能指针可以正确实现运算符->())。

现在, 1 有一个缺点,它强制您希望引用 count 的所有对象都从一个共同的祖先继承,这意味着您不能使用它来引用您无法控制源代码的 count 对象到。

2 的问题是由于计数存储在另一个对象中,如果您曾经遇到将指向现有引用计数对象的指针转换为引用的情况,您可能有一个错误(IE,因为计数不在实际对象,新引用无法获取计数...引用到引用复制构造或赋值很好,因为它们可以共享计数对象,但是如果您必须从指针转换,您重新完全冲洗)...

现在,据我了解, boost::shared_pointer 使用机制 2,或类似的东西......也就是说,我无法完全决定哪个更糟!我只在生产代码中使用过机制 1……有人对这两种风格都有经验吗?或者也许还有另一种比这两种方法更好的方法?

0 投票
10 回答
70699 浏览

c++ - 有什么理由在 C++03 中使用“auto”关键字吗?

注意这个问题最初是在 2009 年发布的,在 C++11 被批准之前并且在auto关键字的含义发生巨大变化之前。提供的答案与 C++03 的含义有关auto——即指定的存储类——而不是 C++11 的含义auto——即自动类型推导。如果您正在寻找有关何时使用 C++11 的建议auto,则此问题与该问题无关。

很长一段时间以来,我认为没有理由static在 C 中使用关键字,因为在块范围之外声明的变量是隐式全局的。然后我发现将变量声明为static在块范围内会赋予它永久的持续时间,而在块范围之外(在程序范围内)声明它会给它文件范围(只能在该编译单元中访问)。

所以这给我留下了一个我(也许)还没有完全理解的关键字:auto关键字。除了“局部变量”之外,它还有其他含义吗?无论您想在哪里使用它,它所做的任何事情都没有为您隐含地完成?auto变量在程序范围内的行为如何?文件范围内的static auto变量是什么?除了为了完整性而存在之外,此关键字是否还有其他用途?

0 投票
5 回答
22878 浏览

c++ - 没有互斥的线程安全静态变量?

我记得读过在方法中声明的静态变量不是线程安全的。(参见Todd Gardner提到的 Meyer 的单身呢?

我的库为最终用户生成 C++ 代码,以作为其应用程序的一部分进行编译。它生成的代码需要以线程安全的跨平台方式初始化静态变量。我想用来boost::call_once对变量初始化进行互斥,但最终用户会暴露于 Boost 依赖项。

有没有办法让我做到这一点,而不需要对最终用户产生额外的依赖?

0 投票
9 回答
47530 浏览

c++ - C ++中Trigraph序列的目的?

根据 C++'03 标准 2.3/1:

在进行任何其他处理之前,每次出现以下三个字符序列(“三字符序列”)中的一个,都将替换为表 1 中指示的单个字符。

在现实生活中,这意味着代码printf( "What??!\n" );将导致打印What|,因为??!它是一个被字符替换的三元组序列|

我的问题是使用三元组的目的是什么?使用三元组有什么实际优势吗?

UPD:在回答中提到一些欧洲键盘没有所有的标点符号,所以非美国程序员必须在日常生活中使用三元组?

UPD2:Visual Studio 2010 默认关闭三元组支持。

0 投票
9 回答
4506 浏览

c++ - 如何编写 `is_complete` 模板?

回答完这个问题后,我试图is_complete在 Boost 库中查找模板,但我意识到 Boost.TypeTraits 中没有这样的模板。为什么Boost库中没有这样的模板?它应该是什么样子?

上面的代码是不正确的,因为应用于sizeof不完整类型是非法的。什么是好的解决方案?在这种情况下是否可以以某种方式应用 SFINAE?


好吧,如果不违反ODR 规则,一般无法解决这个问题,但是有一个特定于平台的解决方案对我有用。