Tag: c ++ 03

如果f修改x,x * f(x)的值是未指定的?

我查看了一系列有关序列点的问题,并且一直没有弄清楚如果f修改x , x*f(x)的评估顺序是否有保证,而f(x)*x 。 考虑这个代码: #include <iostream> int fx(int &x) { x = x + 1; return x; } int f1(int &x) { return fx(x)*x; // Line A } int f2(int &x) { return x*fx(x); // Line B } int main(void) { int a = 6, b = 6; std::cout << f1(a) << " " […]

C ++中使用哪种Typesafe枚举?

众所周知,C ++中的内置枚举不是types安全的。 我想知道哪些类实现types安全枚举在那里使用…我自己使用下面的“自行车”,但它有点冗长和有限: typesafeenum.h: struct TypesafeEnum { // Construction: public: TypesafeEnum(): id (next_id++), name("") {} TypesafeEnum(const std::string& n): id(next_id++), name(n) {} // Operations: public: bool operator == (const TypesafeEnum& right) const; bool operator != (const TypesafeEnum& right) const; bool operator < (const TypesafeEnum& right) const; std::string to_string() const { return name; } // Implementation: private: […]

错误:过时的旧式基类初始化器

以下代码在C ++ 98,C ++ 11和C ++ 14模式下尝试的所有版本的GCC上产生后续编译错误: struct T { T(void* x) : (x) {} }; // main.cpp: In constructor 'T::T(void*)': // main.cpp:3:18: error: anachronistic old-style base class initializer [-fpermissive] // T(void* x) : (x) {} // ^ // main.cpp:3:16: error: unnamed initializer for 'T', which has no base classes // T(void* x) : (x) […]

在C ++的类初始化器中初始化一个常量数组

我在C ++中有以下类: class a { const int b[2]; // other stuff follows // and here's the constructor a(void); } 问题是,如何初始化初始化列表中的b,因为我不能在构造函数的主体中初始化它,因为b是const ? 这不起作用: a::a(void) : b([2,3]) { // other initialization stuff } 编辑:在这种情况下,我可以有不同的值为b不同的实例,但值已知是实例的生命周期不变。

默认值,零初始化乱七八糟

我对值初始化和默认初始化非常困惑。 特别是当他们开始使用不同的标准C ++ 03和C ++ 11 (和C ++ 14 )时。 我引用并试图扩展一个非常好的答案Value- / Default- / Zero-Init C ++ 98和C ++ 03在这里使它更通用,因为如果有人可以帮助填写需要的差距有一个很好的概述什么时候发生? 简而言之,通过实例的全面洞察力: 有时,新运算符返回的内存将被初始化,有时它不会取决于新build的types是POD(普通旧数据) ,还是包含POD成员的类,并且正在使用编译器生成的默认构造函数。 在C ++ 1998中有两种types的初始化:零和默认 在C ++ 2003中第三种types的初始化,增加了值初始化。 在C ++ 2011 / C ++ 2014中,只添加了列表初始化,并且value- / default- / zero-initialization的规则有所改变。 承担: struct A { int m; }; struct B { ~B(); int m; }; struct […]

在运行时可以检测到C ++ 03和C ++ 11之间有什么区别?

可以编写一个函数,当使用C编译器编译时,它将返回0,当使用C ++编译器编译时,函数将返回1(使用#ifdef __cplusplus的平凡的#ifdef __cplusplus不是很有趣)。 例如: int isCPP() { return sizeof(char) == sizeof 'c'; } 当然,只有当sizeof (char)和sizeof (int)不一样时, 另一个更便携的解决scheme是这样的: int isCPP() { typedef int T; { struct T { int a[2]; }; return sizeof(T) == sizeof(struct T); } } 我不确定这些例子是否100%正确,但是你明白了。 我相信还有其他的方法来编写相同的function。 在运行时可以检测到C ++ 03和C ++ 11之间有什么区别? 换句话说,是否有可能编写一个类似的函数,它会返回一个布尔值,表示它是否由符合的C ++ 03编译器或C ++ 11编译器编译? bool isCpp11() { //??? }

C ++代码可以在C ++ 03和C ++ 11中都有效,但可以做不同的事情吗?

C ++代码是否可以符合C ++ 03标准和C ++ 11标准,但根据编译的标准做不同的事情?

是否有任何理由在C ++ 03中使用“自动”关键字?

注意,这个问题最初是在2009年发布的,在C ++ 11被批准之前, auto关键字的含义被彻底改变之前。 所提供的答案仅适用于自动types的C ++ 03含义 – 即指定的存储类 – 而不是自动types推导的C ++ 11的含义。 如果您正在寻找有关何时使用C ++ 11 auto ,则此问题与此问题无关。 最长的时间我以为没有理由在C中使用static关键字,因为在块范围之外声明的variables是隐式的全局variables。 然后我发现在块范围内声明一个variables为static会给它一个永久的持续时间,并且在块范围外(在程序范围内)声明它会给它一个文件范围(只能在该编译单元中访问)。 所以这给我留下了只有一个我可能还没有完全理解的关键字: auto关键字。 除了“局部variables”还有其他一些含义吗? 它所做的任何事情都不是在你想要使用它的地方为你做的。 autovariables在程序范围中如何performance? 什么是文件范围内的static autovariables? 这个关键词除了完整性以外还有其他用途吗?

类C,构造函数和统一初始化之间有什么区别?

TTBOMK,在C ++中有三种方法来初始化一个variables。 int x = 0; // C-like initialization int x (0); // Constructor initialization int x {0}; // Uniform initialization C ++ 11为统一初始化提供了一个更统一的语法来初始化不同types的variables,这些variables在C ++ 03中需要不同的语法。 类C,构造函数和统一初始化之间有什么区别? 我应该总是使用统一的初始化?

Trigraph序列在C ++中的目的是什么?

根据C ++的“03标准2.3 / 1: 在进行任何其他处理之前,每个出现三个字符(“三字母序列”)的以下序列之一被表1中指示的单个字符replace。 —————————————————————————- | trigraph | replacement | trigraph | replacement | trigraph | replacement | —————————————————————————- | ??= | # | ??( | [ | ??< | { | | ??/ | \ | ??) | ] | ??> | } | | ??' | ˆ | ??! | | | […]