小编mrk*_*rkj的帖子

构造函数的右大括号中无法访问的代码

我正在开发一个用VC9构建的应用程序,我遇到了一个我不完全理解的警告:为什么在构造函数的右括号上有一个"无法访问的代码"警告?

重现问题的最小测试用例是:

__declspec(noreturn) void foo() {
  // Do something, then terminate the program
}
struct A {
  A() {
    foo();
  } // d:\foo.cpp(7) : warning C4702: unreachable code
};
int main() {
  A a;
}
Run Code Online (Sandbox Code Playgroud)

必须使用/ W4编译才能触发警告.或者,您可以使用/ we4702进行编译,以强制检测此警告时出错.

d:\>cl /c /W4 foo.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 15.00.21022.08 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

foo.cpp
d:\foo.cpp(7) : warning C4702: unreachable code
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下,究竟是什么在这里无法到达? 我最好的理论是它是析构函数,但我想要一个确定的答案.

如果我想让这段代码警告清洁,我该如何实现呢? 我能想到的最好的是将其转换为编译时错误.

struct A {
private:
  A(); // No, you can't construct …
Run Code Online (Sandbox Code Playgroud)

c++ constructor visual-c++-2008 visual-c++ unreachable-code

7
推荐指数
1
解决办法
1515
查看次数

如何使vc ++和g ++在依赖限定类型的typename上表现相同?

我可以提供的开关是否cl.exetypename在合格的从属类型中缺少警告或错误?

我正在一个开发人员倾向于在Windows或Linux上运行一个平台的环境中工作,并且代码最终每晚都在这两个平台上构建.我们遇到了一个问题,人们忘记typename在Windows上使用合格的依赖类型,typename如果可能的话,Visual C++ 2008会自动插入缺失的类型.当他们检查这样的代码时,它打破了Linux上的构建,g++ 需要typename.我们希望调整一下Makefile,以便我们可以期望typename在Windows和Linux上采用相同的行为来减轻构建破坏的可能性.我更喜欢这种g++行为,但是任何可以帮助这两个平台表现相同的东西都会非常感激.

另请参阅为什么我需要在g ++中使用typedef typename而不是VS?

c++ templates g++ visual-c++

6
推荐指数
2
解决办法
236
查看次数