我有几个宏,一个返回一个值,另一个返回void函数的情况,基本上用其参数和(void)0
调用另一个。当使用VS和GCC编译它时,我在构造函数中调用它时遇到了一些意想不到的编译问题。
我尝试运行以下操作,在ubuntu 14.04和部分VS2013上使用gcc b.cpp
(gcc版本4.8.4),clang c.bpp
(clang版本3.4-1)取消评论5个案例中的每一个WIN7,
#include <cstdio>
struct A {
A() {
return ((void)0); // case 0 => gcc err, clang ok, msvc err
//return (void)0; // case 1 => gcc err, clang ok, msvc ok
//return (); // case 2 => gcc err, clang err, msvc err
//return; // case 3 => gcc ok, clang ok, msvc ok
//; // case 4 => gcc ok, clang ok, msvc ok
}
} a;
int main()
{
printf("%p\n", &a);
}
我希望所有人都有类似的效果(我不确定案例2)但是我得到了一些奇怪的失败......
案例2:
$ gcc b.cpp
b.cpp: In constructor ‘A::A()’:
b.cpp:7:17: error: expected primary-expression before ‘)’ token
return ();
^
b.cpp:7:17: error: returning a value from a constructor
$ clang b.cpp
b.cpp:7:17: error: expected expression
return ();
^
1 error generated.
案例1:
$ gcc b.cpp
b.cpp: In constructor ‘A::A()’:
b.cpp:6:22: error: returning a value from a constructor
return (void)0;
案例0:
$ gcc b.cpp
b.cpp: In constructor ‘A::A()’:
b.cpp:5:24: error: returning a value from a constructor
return ((void)0);
这里的正确行为是什么?我怎么能调整说几个像
的宏#define MOO(a, b, retVal) \
do \
... \
return (retVal); \
while(0)
#define FOO(a, b) MOO((a), (b), (void)0)
也为c'tors工作?是否有更多的c ++ - ish方法使用decltype返回(void)0,-1,SOME_NONE和其他默认值以便在这些宏中进行错误处理中止?
(一个有点无关的问题是,大概在代码中gcc决定我从c'tor返回一个值?)
答案 0 :(得分:4)
根据C ++ 11标准12.1.8
构造函数体中的return语句不应指定返回值。
因此,如果从构造函数返回值,则应该是错误。
我认为return (void)0;
作为构造函数中的返回的原因无法使用,请参阅6.6.3.2
既没有表达式也没有braced-init-list的return语句只能用于不返回值的函数,即返回类型为cv void的函数,构造函数(12.1)或者析构函数(12.4)。
由于(void)0
被视为表达式,因此无法在构造函数中使用。