草庐IT

c++ - 不完整类型的静态字段 - 合法吗?

在C++中声明类定义时不完整类型的静态字段是否合法?例如:Foo.h:classFoo{public://...private:classBar;staticBarsomething;};Foo.cpp:classFoo::Bar{//...};Foo::BarFoo::something;//somemorecode编译器似乎接受它,我看不出应该拒绝它的原因,但标准对这种情况有什么看法?我非常感谢有人直接引用标准,最好是“旧”标准(2003年的标准)。 最佳答案 是的,您正在做的事情是明确允许的(第9.4.2/2节):“静态数据成

c++ - 通过引用函数来传递新构造的对象是否合法?

具体来说,下面的C++是否合法?classA{};voidfoo(A*);voidbar(constA&);intmain(void){foo(&A());//1bar(A());//2}它似乎可以正常工作,但这并不意味着它一定是合法的。是吗?编辑-将A&更改为constA& 最佳答案 1:不允许使用临时地址。VisualC++允许它作为语言扩展(语言扩展默认开启)。2:这是完全合法的。 关于c++-通过引用函数来传递新构造的对象是否合法?,我们在StackOverflow上找到一个类似

c++ - 通过引用函数来传递新构造的对象是否合法?

具体来说,下面的C++是否合法?classA{};voidfoo(A*);voidbar(constA&);intmain(void){foo(&A());//1bar(A());//2}它似乎可以正常工作,但这并不意味着它一定是合法的。是吗?编辑-将A&更改为constA& 最佳答案 1:不允许使用临时地址。VisualC++允许它作为语言扩展(语言扩展默认开启)。2:这是完全合法的。 关于c++-通过引用函数来传递新构造的对象是否合法?,我们在StackOverflow上找到一个类似

c++ - 对不完整类型的空指针调用 delete 是否合法?

如果是这样,为什么下面的代码会给我警告note:neitherthedestructornortheclass-specificoperatordeletewillbecalled,eveniftheyaredeclaredwhentheclassisdefined?structC;intmain(){C*c=nullptr;deletec;return0;}我理解如果C有非平凡的/虚拟的析构函数,为什么它可能在一般情况下是未定义的行为,但没有无论情况如何,标准保证/定义nullptr上的delete始终是noop?重申一下:我特别询问指向不完整类型的指针是nullptr!的情况

c++ - 对不完整类型的空指针调用 delete 是否合法?

如果是这样,为什么下面的代码会给我警告note:neitherthedestructornortheclass-specificoperatordeletewillbecalled,eveniftheyaredeclaredwhentheclassisdefined?structC;intmain(){C*c=nullptr;deletec;return0;}我理解如果C有非平凡的/虚拟的析构函数,为什么它可能在一般情况下是未定义的行为,但没有无论情况如何,标准保证/定义nullptr上的delete始终是noop?重申一下:我特别询问指向不完整类型的指针是nullptr!的情况

c++ - 为什么调用静态成员函数。或 -> 语法合法?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:C++Staticmembermethodcallonclassinstance今天我发现我长久以来(我的意思是长久——比如,二十年),在C++中认为非法的东西实际上是合法的。即,调用静态成员函数,就好像它属于单个对象一样。例如:structFoo{staticvoidbar(){cout我通常会看到严格使用“范围解析语法”调用静态成员函数,因此:Foo::bar();这是有道理的,因为静态成员函数不与类的任何特定实例相关联,因此我们不希望特定实例在语法上“附加”到函数调用。然而我今天发现GCC4.2、GCC

c++ - 为什么调用静态成员函数。或 -> 语法合法?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:C++Staticmembermethodcallonclassinstance今天我发现我长久以来(我的意思是长久——比如,二十年),在C++中认为非法的东西实际上是合法的。即,调用静态成员函数,就好像它属于单个对象一样。例如:structFoo{staticvoidbar(){cout我通常会看到严格使用“范围解析语法”调用静态成员函数,因此:Foo::bar();这是有道理的,因为静态成员函数不与类的任何特定实例相关联,因此我们不希望特定实例在语法上“附加”到函数调用。然而我今天发现GCC4.2、GCC

c++ - move 字符串流的 .str() 成员是否合法?

考虑以下示例:#includetemplateinlinestd::stringto_string(Tconst&op){std::ostringstreamresult;result如果我要返回result,而不是result.str(),它将自动成为一个右值。结果中包含的字符串并非如此(我假设)。我的期望是它被复制并且拷贝作为右值返回。所以我的问题是,这样做是否合法:returnstd::move(result.str());我会假设它是,期望流留下一个有效的空字符串。但我并不确定是否真的去做。 最佳答案 std::ostrea

c++ - move 字符串流的 .str() 成员是否合法?

考虑以下示例:#includetemplateinlinestd::stringto_string(Tconst&op){std::ostringstreamresult;result如果我要返回result,而不是result.str(),它将自动成为一个右值。结果中包含的字符串并非如此(我假设)。我的期望是它被复制并且拷贝作为右值返回。所以我的问题是,这样做是否合法:returnstd::move(result.str());我会假设它是,期望流留下一个有效的空字符串。但我并不确定是否真的去做。 最佳答案 std::ostrea

c++ - 将 C 与 C++ 链接是否可以避免在 C 中合法但在 C++ 中不合法的未定义行为?

如果您有一个使用C编译器编译的C文件,并且为C而定义了C而不是C++的行为,您能否将它与C++文件链接并且没有未定义的行为?在blah.c(编译为C的文件)中structx{intblah;charbuf[];};externchar*get_buf(structx*base);externstructx*make_struct(intblah,intsize);blah_if.hextern"C"{structx;char*get_buf(structx*base);structx*make_struct(intblah,intsize);}some_random.cpp(使用C++