c ++从c'tor返回+错误处理的默认返回值

时间:2015-08-10 19:00:40

标签: c++ gcc language-lawyer return-type clang++

我有几个宏,一个返回一个值,另一个返回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返回一个值?)

1 个答案:

答案 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被视为表达式,因此无法在构造函数中使用。