标签: c++03

多线程环境中的静态局部变量初始化

假设有一个函数(可能是成员函数)

SomeType foo()
{
    static SomeType var = generateVar();
    return var;
}
Run Code Online (Sandbox Code Playgroud)

var如果foo将同时从多个线程"第一次"调用,将如何初始化?

  1. 是否保证generateVar()在任何情况下只调用一次(如果使用的话)?
  2. 是否保证foo在任何情况下多次调用时都会返回相同的值?
  3. 原始类型或非原始类型的行为是否存在差异?

c++ multithreading initialization c++11 c++03

19
推荐指数
1
解决办法
1578
查看次数

C++ 03和C++ 11之间未定义行为的区别是什么?

新标准具有与旧标准不同的未定义行为.例如,新的排序规则意味着现在定义了一些过去未定义的算术运算(出于诸如序列点之间的多次写入的原因).

那么,我们需要重新学习未定义的行为?

c++ undefined-behavior c++11 c++03

18
推荐指数
1
解决办法
516
查看次数

为什么内联函数默认具有外部链接?

标准说,给出声明

inline void foo();
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

c++ inline linkage c++11 c++03

18
推荐指数
2
解决办法
2913
查看次数

将va_start宏与此参数一起使用是否安全?

我必须在嵌入式应用程序中使用IAR编译器(它没有名称空间,异常,多重/虚拟继承,模板受位限制并且仅支持C ++ 03)。我无法使用参数包,因此尝试使用可变参数创建成员函数。我知道可变参数通常是不安全的。但是thisva_start宏中使用指针是否安全?

如果我使用普通的可变参数函数,则需要一个伪参数才能...访问其余参数。我知道可变参数宏之前不需要参数,...但我不希望使用它。如果我使用成员函数,则它this之前具有隐藏参数,...因此我尝试了它:

struct VariadicTestBase{
  virtual void DO(...)=0;
};

struct VariadicTest: public VariadicTestBase{
  virtual void DO(...){
    va_list args;
    va_start(args, this);
    vprintf("%d%d%d\n",args);
    va_end(args);
  }
};

//Now I can do
VariadicTestBase *tst = new VariadicTest;
tst->DO(1,2,3);
Run Code Online (Sandbox Code Playgroud)

tst->DO(1,2,3);按预期打印123。但是我不确定这是否只是一些随机/未定义的行为。我知道tst->DO(1,2);会像普通的prinf一样崩溃。我不介意。

c++ variadic language-lawyer c++03

18
推荐指数
1
解决办法
787
查看次数

"&a + 1>&a"会导致未定义的行为

c99/c++03保证&a+1 > &a永远是真的吗?

例如,有一个(类似c)std::copy,和

int a = 0 ;
int b[9] ;
std__copy(&a , &a+1 , b) ;
Run Code Online (Sandbox Code Playgroud)

这总是有效吗?

c c++ c99 c++03

17
推荐指数
1
解决办法
333
查看次数

如何在CentOS 6上部署C++ 11程序(带有依赖项),其GCC是C++ 03?

只要您使用相同的C++标准,GCC就具有ABI兼容性[ 1 ].

但令我感到震惊的是,如果GCC 4.3在C++ 03模式下编译的共享库暴露出来,比如a std::string,这将与std::stringGCC 4.8在C++ 11模式下编译的可执行文件所理解的不同.

我问的原因是我计划在CentOS 6上以C++ 11模式部署由GCC 4.8编译的程序,其最大打包GCC是4.3 ......以及一些共享库(它们是第三方C++库)或者更多系统级的东西)因此可能都是C++ 03.但如果是这种情况,我们永远无法在较旧的Linux发行版上部署任何C++ 11程序,这似乎不太可能.

我天真地认为这里可能存在问题吗?而且,如果有,我该如何解决?

c++ compatibility gcc c++11 c++03

17
推荐指数
2
解决办法
1580
查看次数

隐含的特殊功能:什么时候它们会形成错误?

在ISO 国际标准 C++ 11中,给出了c ++ 2003和C++ 2011之间差异的总结.其中一个不同之处是:

[diff.cpp03.special]

更改:当隐式定义不正确时,隐式声明的特殊成员函数被定义为已删除.

理由:改进模板参数推导失败.

对原始特征的影响:在不需要定义的上下文中使用这些特殊成员函数之一的有效C++ 2003程序(例如,在无法评估的表达式中)变得格式不正确.

我没有看到这种特殊功能在哪种情况下会形成错误,以及它如何打破SFINAE.所以我的问题归结为:

  • 为什么这样的改变会"改善模板参数演绎失败"
  • 你举个例子吗?

c++ c++11 c++03

16
推荐指数
1
解决办法
816
查看次数

当新大小小于当前大小时,std :: vector :: resize()是否会重新分配?

可能重复:
std :: vector向下调整大小

如果我resize()std::vector尺寸小于其当前尺寸,那么矢量是否可能会分配新内存?

出于性能原因,这对我很重要.

c++ std c++11 c++03 c++98

15
推荐指数
2
解决办法
6020
查看次数

静态类成员是否保证在调用`main`之前初始化?

是否有任何保证静态类成员在main被调用之前被初始化?

c++ language-lawyer c++03

15
推荐指数
1
解决办法
2466
查看次数

ISO C++ 03对函数范围定义的结构有什么限制?

我们不允许在函数内部定义functor结构,因为不允许在函数模板的实例化中使用函数声明的结构.

还有其他重要的陷阱需要注意吗?例如,这会是坏事:

int foo()
{
    struct Scratch
    {
        int a, b, c;
    };
    std::vector<Scratch> workingBuffer;
    //Blah Blah
}
Run Code Online (Sandbox Code Playgroud)

c++ c++03

14
推荐指数
1
解决办法
1979
查看次数