C'Tor 的 C++ 返回值 + 错误处理的默认返回值

c++ return from c'tor + default return values for err handling

本文关键字:返回值 错误 处理 默认 C++ Tor      更新时间:2023-10-16

我有几个宏,一个返回值,另一个返回void函数的情况下,基本上调用另一个与它的参数和(void)0。当用VS和GCC编译它时,我遇到了一些意想不到的编译问题,因为它是从构造函数中调用的。

我试着运行以下程序,取消对ubuntu 14.04上的gcc b.cpp (gcc版本4.8.4),clang c.bpp (clang版本3.4-1)和win7上的一些VS2013的5种情况的注释,

#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("%pn", &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' s工作吗?是否有一种更c++的方法来使用decltype返回(void)0, -1, SOME_NONE和其他默认值,用于在这些宏中错误处理中止?

(一个有点不相关的问题是,大约在代码中的什么地方,gcc决定我从c'tor返回一个值?)

根据c++ 11标准12.1.8

构造函数体中的返回语句不能指定返回值。

所以如果你从构造函数返回一个值,应该是一个错误。

我相信return (void)0;作为构造函数的返回不能被使用的原因在6.6.3.2

中已经说明了

既不带表达式也不带带括号的init-list的return语句只能用于不返回值的函数,即返回类型为cv void的函数、构造函数(12.1)或析构函数(12.4)。

由于(void)0被认为是一个表达式,它不能在构造函数中使用。