C'Tor 的 C++ 返回值 + 错误处理的默认返回值
c++ return from c'tor + default return values for err handling
我有几个宏,一个返回值,另一个返回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
被认为是一个表达式,它不能在构造函数中使用。
相关文章:
- 方法错误"not all control paths return a value"和方法不返回值
- 不断收到错误消息,并非所有控制路径都返回值
- CUDA返回值错误35的含义是什么
- 为什么我的代码返回了错误的平方值?C++
- 不从函数返回值会导致段错误
- g++ 抛出错误而不返回值
- 错误C4716:rectionDownLog:必须返回值
- 如何避免使用多个if-else来检查返回值是否为错误代码?
- 函数模板中的无效转换错误,返回值取决于其泛型类型
- GMock 的"WillOnce"和"Return"不会因错误的返回值而失败
- C 11返回值和错误对
- 如何修复包含错误的错误必须返回值
- 程序未完成返回值3221225477没有编译器错误
- 类返回值错误
- 函数返回值错误
- 返回值错误
- 访问类的成员时返回值错误
- 第二个IntObject.getValue()的返回值错误
- c++错误处理返回值错误返回
- C'Tor 的 C++ 返回值 + 错误处理的默认返回值