草庐IT

static-initialization

全部标签

c++ - 不寻常的 static_cast 语法

我设法追踪到以下表达式的错误:foo(static_cast(a,b));//Executesspecialisation1右括号位置错误。正确的说法应该是:foo(static_cast(a),b);//Executesspecialisation2我从未见过static_cast与形式(a,b)一起使用,也从未在任何地方见过它的描述。这是什么意思?前面的语句返回b。 最佳答案 static_cast不是一个函数,它是一个关键字,所以a,b中的逗号不是参数分隔符;它是commaoperator.它评估a但丢弃结果。表达式的计算结果

c++ - 为什么 static_cast 在逻辑上应该出于安全目的拒绝它们或者 static_cast 与安全无关时允许向下转换?

在下面的示例中,编译器接受static_cast向下转换,导致未定义的行为,而我认为static_cast完全是为了安全(C风格转换无法提供).#includeclassBase{public:intx=10;};classDerived1:publicBase{public:inty=20;};classDerived2:publicBase{public:intz=30;intw=40;};intmain(){Derived1d1;Base*bp1=static_cast(&d1);Derived2*dp1=static_cast(bp1);std::coutzw

c++ - 为什么这个 static_cast 是不允许的?

我有一个A类对象,我想将其分配到自定义堆栈对象上。为此,我只需将堆栈指针移动与对象大小相同的字节数并返回其先前的值:classA:publicB{};//Bisfromaprecompiledlibraryclassstack{public:stack(void):_top(&_storage[0]){}templateinlineT*push(void){T*ptr=static_cast(_top);_top+=sizeof(T);returnptr;}//...private:char_storage[1024];char*_top;};stack_stack;intmain(i

c++ - 在 C++ 中声明 "static"变量时, "global"到底是什么意思?

这是对previousquestionofmine范围的扩展.“static”到底是什么,如何使用,在处理C++时使用“static”的目的是什么?谢谢。 最佳答案 这意味着该变量是翻译单元的本地变量(简单地说,是单个源文件),无法从外部访问。static的这种使用实际上在当前的C++标准中已被弃用-相反,您应该使用匿名namespace:staticintx=0;应该是:namespace{intx=0;} 关于c++-在C++中声明"static"变量时,"global"到底是什么意

C++17 static 和 constexpr

我正在使用与Xcode9.3捆绑在一起的clang,我试图了解以下结果是否是C++17更改的有意部分:#includetemplatestructTest{staticconstintTEN;};templateconstexprintTest::TEN=10;intmain(intargc,constchar*argv[]){std::cout::TEN当使用c++11或c++14编译时,这将打印“10”。但是,使用c++17编译它时,会打印“0”。这是怎么回事? 最佳答案 在别处发布后,一位clang开发人员承认这是clang-

c++ - 在 vector 图上使用 initializer_list

我一直在尝试初始化>的map使用新的0X标准,但我似乎无法获得正确的语法。我想制作一个带有key:value=1:的单个条目的map#include#include#includeusingnamespacestd;map>A={1,{3,4}};....它在使用gcc4.4.3时出现以下错误:error:nomatchingfunctionforcalltostd::map>,std::less,std::allocator>>>>::map()编辑按照Cogwheel的建议并添加额外的大括号,它现在编译时带有警告,可以使用-fno-deduce-init-list标志消除该警告。这

c++ - constexpr(gcc) 错误 - 错误 : a brace-enclosed initializer is not allowed here before '{' token

structX{constexprstaticchara1[]="hello";//Okayconstexprstaticconstchar*a2[]={"hello"};//Error};intmain(){}用gcc编译报错:error:abrace-enclosedinitializerisnotallowedherebefore'{'token这是对constexpr的非法使用吗?编辑我尝试了3个不同版本的gcc,它是在我拥有的最新4.7.0上编译的(我刚刚下载了它,我使用的是mingw-w64),所以它看起来是一个固定的错误(链接到bug会很好!)。4.7.020120311

C++11 initializer_list 构造函数标记为 "explicit"

我能否将explicit与init-list构造函数一起使用,以确保像{a}这样的表达式不会导致意外的隐式转换?还有一个想法:应该我担心吗?编写{a}比简单地编写a不太可能出错,但另一方面,从代码中我们可能仍然不清楚我们正在构建一个通过隐式转换对象。classFoo{explicitFoo(std::initializer_listilist){/*...*/}}; 最佳答案 你不能。它确实导致意外的隐式转换。但是,意外的隐式转换是不允许的,编译器将拒绝您的程序。然而,这不会阻止编译器选择或考虑它。示例voidf(Foo);void

c++ - 错误 : jump to label 'foo' crosses initialization of 'bar'

以下C++示例无法使用gcc或clang进行编译,但仅使用ICC生成警告,而使用MSVC则完全不生成任何警告:intmain(intargc,char*argv[]){if(argcg++:init.cpp:13:error:jumptolabel‘clean_up’init.cpp:4:error:fromhereinit.cpp:7:error:crossesinitializationof‘inti’clang++:init.cpp:4:9:error:cannotjumpfromthisgotostatementtoitslabelgotoclean_up;^init.cpp:

c++ - static_cast 如何与虚拟继承一起使用?

因此不可能使用具有虚拟继承的static_cast进行向下转型,但是如何进行以下向上转型:classBase{...};classDerived:publicvirtualBase{...};...Derived*d=newDerived();Base*b=static_cast(d);对象的内存布局:[derivedpart|basepart]我知道向上转型被认为是“安全的”,但是当继承是虚拟的时,编译器如何在编译时知道基础子对象的偏移量?static_cast是否使用vtable?当我们有这样的东西(注意它不是虚拟的)时,这尤其令人困惑:classThird:publicDeriv