问题标签 [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 投票
4 回答
3982 浏览

c++ - 临界区和单例模式

背景:在函数中使用局部静态变量作为单例模式的实现的一个问题是,如果多个线程同时第一次调用该函数,则可以完成静态变量的初始化两次。

我的问题是,如果您将静态变量的初始化包装在关键部分中,这会阻止双重初始化的发生吗?例子:

还是神奇地完成了初始化(而不是在声明/初始化时),就像在构造函数开始之前初始化变量成员一样?

我的问题专门针对 C++11 之前的版本,因为根据 Xeo 的回答,C++11 会自行解决这个问题。

0 投票
2 回答
4083 浏览

c++ - “向后移植” nullptr 到 C++-pre-C++0x 程序

或多或少是标题所暗示的。虽然我还没有使用 C++0x,但我想为它发生时做好准备,并且我还想减少我必须重写以使用它的一些工具的代码量。这样我就可以一次性获得向后和向前的兼容性。

我发现的最有趣的一个是nullptr,我最近经常使用它。

在检查了“官方解决方法”和Meyer 的建议之后,我决定在我的 C++ 和未来的 C++0x 程序中都使用它。第二部分很简单——作为关键字,nullptr将被简单地支持。但第一部分让我有些不适。

Meyers 提案的功能如下:

该提议的问题在于它声明了要按照std::nullptr_tC++0x 要求声明的类型。这意味着要使解决方法“感觉原生”,必须通过重新打开std::命名空间来添加类型来完成。我有这样的理解,在 C++ 程序中这样做是非法的(不像添加专业化,这显然是皱眉和放手警告)。

我想在 C++ 程序nullptr中以舒适和合法的方式使用。我想到的一个选择是在另一个命名空间中声明类型,然后将其引入 using using

这是使它工作的正确方法吗?它将强制using指令,这也强制指令的特定顺序#include。我是否期望没有 C++0x 之前的代码会请求nullptr_t具有命名空间的类型(例如,作为函数参数类型)?如果这样做,它真的会“感觉像本地人”吗?


作为附录,尝试将一些漂亮的 C++0x 东西反向移植到 C++ 以获得更好的兼容性和编码是受欢迎的还是不受欢迎的?与此同时,我已经将这个解决方案和我正在开发的其他解决方案集成到一个要发布的软件中

0 投票
1 回答
622 浏览

c++ - `*--p` 在 C++03 中实际上是否合法(格式正确)

我想知道这段代码示例:

这段代码实际上在 C++03 中格式正确吗?

我的论点是 的副作用=仅在下一个序列点之后完成,并且由于我们正在访问代码的结果可能格式不正确,因此和操作p=arr之间没有排序。=[]

我对么?

该行为在 C 和 C++11 中得到了很好的定义。这段代码实际上是从 MySQL 派生的。

0 投票
3 回答
9793 浏览

c++ - 获取成员的类型

注意:这个问题最初是在 2012 年提出的。在decltype任何主要编译器完全实现说明符之前。除非您只能访问 C++03,否则您不应查看此代码。所有主要的 C++11 兼容编译器现在都支持decltype.

有没有一种简单的方法来检索成员的类型?
在 C++03 中

我实际上正在这样做(即有点懒惰):

但不必强制用户指定成员的类型,我希望编译器以实用的方式生成它。

0 投票
1 回答
92 浏览

templates - 在模板类上使用子句

为了使引用类型更容易,您可以使用 using 子句将单个类型带入当前范围:

问题是该类是否是模板类(或函数)。是否可以在不完全实例化它们的情况下将它们带入当前范围?

0 投票
5 回答
1501 浏览

c++ - 指向未指定类类型的成员函数指针 - 可能吗?

是否可以声明一个函数指针(非 C++ 11)可以指向任何类的成员函数(阅读:不是特定的类)?

例如,如果我有 A、B 和 C 类。C 在其中声明了一个函数指针,我想在指向 B 的成员函数之一和 A 的成员函数之一之间切换该指针。C++ 允许这样做吗?

0 投票
2 回答
2008 浏览

c++ - C++03. 在编译时测试 rvalue-vs-lvalue,而不仅仅是在运行时

在 C++03 中,Boost 的 Foreach 使用这种有趣的技术,可以在运行时检测表达式是左值还是右值。(我通过这个 StackOverflow 问题发现:Rvalues in C++03

这是在运行时工作的演示

(这是我在考虑我最近提出的另一个问题时出现的一个更基本的问题。对此的答案可能有助于我们回答另一个问题。)

现在我已经说明了问题,在编译时测试 C++03 中的右值性,我将谈谈我迄今为止一直在尝试的事情。

我希望能够在compile-time进行此检查。在 C++11 中这很容易,但我对 C++03 很好奇。

我正在尝试以他们的想法为基础,但也会对不同的方法持开放态度。他们技术的基本思想是将这段代码放入一个宏中:

左边是“真” ?,因此我们可以确定 EXPRESSION 永远不会被计算。但有趣的是,?:运算符的行为取决于其参数是左值还是右值(单击上面的链接了解详细信息)。特别是,它将rvalue_probe以两种方式之一转换我们的对象,具体取决于 EXPRESSION 是否为左值:

这在运行时有效,因为抛出的文本可以被捕获并用于分析 EXPRESSION 是左值还是右值。但我想要一些方法来识别,在编译时,正在使用哪种转换。

现在,这可能很有用,因为这意味着,而不是询问

EXPRESSION 是右值吗?

我们可以问:

编译器何时编译true ?rvalue_probe() : EXPRESSION,选择两个重载运算符中的哪operator X一个operator X&

(通常,您可以通过更改返回类型并获取它来检测调用了哪个方法sizeof。但是我们不能使用这些转换运算符来做到这一点,尤其是当它们被埋在. 中时?:。)

我以为我可以使用类似的东西

如果 EXPRESSION 是一个左值,则operator&选择了,我希望整个表达式将是一个&类型。但这似乎不起作用。ref 类型和非 ref 类型很难区分(不可能?),尤其是现在我正试图在?:表达式中挖掘以查看选择了哪个转换。

这是粘贴在这里的演示代码:

(最后我在这里有一些其他代码,但这只是令人困惑的事情。你真的不想看到我在答案中失败的尝试!上面的代码演示了它如何在运行时测试左值与右值。)

0 投票
6 回答
1183 浏览

c++ - 如何在 C++ 跨平台 snprintf 中实现?

我想知道是否有可能以及如何在 C++ 跨平台(C99,C++0x 独立)中实现snprintf?有没有这样的提升?(我想知道要替换的 C++ 习语是snprintf(4)什么?)

0 投票
2 回答
3157 浏览

c++ - 为什么内联函数默认有外部链接?

该标准说,给定一个声明

foo是一个具有外部链接的内联函数(因为默认情况下所有函数声明都具有外部链接)。这让我觉得很奇怪。因为一个定义规则第 3.2 节(在 C++03 和 C++11 中)说:

3 ... 内联函数应在使用它的每个翻译单元中定义。

5 可以有多个 a[n] 的定义......具有外部链接的内联函数(7.1.2)......给定这样一个名为 D 的实体在多个翻译单元中定义...... D 的每个定义都应由相同的标记序列组成

这意味着内联函数也可能具有内部链接,因为通过外部链接(即跨翻译单元)以任何方式使用该函数将调用未定义的行为(根据第 3 段),并且所有翻译单元中的内联函数必须相同。

此规则是否存在向后兼容性或特定工具链原因?

0 投票
3 回答
258 浏览

c++ - 为什么 C++03 文件流不接受字符串构造函数参数?

为什么下面的代码能编译进去C++11而不能编译进去C++03gcccl

为什么C++03流不接受std::string作为构造函数参数?这个决定是基于某事还是偶然发生的?