假设有一个函数(可能是成员函数)
SomeType foo()
{
static SomeType var = generateVar();
return var;
}
Run Code Online (Sandbox Code Playgroud)
var如果foo将同时从多个线程"第一次"调用,将如何初始化?
generateVar()在任何情况下只调用一次(如果使用的话)?foo在任何情况下多次调用时都会返回相同的值?新标准具有与旧标准不同的未定义行为.例如,新的排序规则意味着现在定义了一些过去未定义的算术运算(出于诸如序列点之间的多次写入的原因).
那么,我们需要重新学习未定义的行为?
标准说,给出声明
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段),并且内容为所有翻译单元中的内联功能需要相同.
此规则是否存在向后兼容性或特定工具链的原因?
我必须在嵌入式应用程序中使用IAR编译器(它没有名称空间,异常,多重/虚拟继承,模板受位限制并且仅支持C ++ 03)。我无法使用参数包,因此尝试使用可变参数创建成员函数。我知道可变参数通常是不安全的。但是this在va_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一样崩溃。我不介意。
并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++标准,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程序,这似乎不太可能.
我天真地认为这里可能存在问题吗?而且,如果有,我该如何解决?
在ISO 国际标准 C++ 11中,给出了c ++ 2003和C++ 2011之间差异的总结.其中一个不同之处是:
[diff.cpp03.special]
更改:当隐式定义不正确时,隐式声明的特殊成员函数被定义为已删除.
理由:改进模板参数推导失败.
对原始特征的影响:在不需要定义的上下文中使用这些特殊成员函数之一的有效C++ 2003程序(例如,在无法评估的表达式中)变得格式不正确.
我没有看到这种特殊功能在哪种情况下会形成错误,以及它如何打破SFINAE.所以我的问题归结为:
我们不允许在函数内部定义functor结构,因为不允许在函数模板的实例化中使用函数声明的结构.
还有其他重要的陷阱需要注意吗?例如,这会是坏事:
int foo()
{
struct Scratch
{
int a, b, c;
};
std::vector<Scratch> workingBuffer;
//Blah Blah
}
Run Code Online (Sandbox Code Playgroud)