关于何时调用普通类的静态成员的构造函数,有大量信息.但是,我看到一些关于模板类的奇怪行为.
以下程序的输出应该是什么?(注意我使用printf来避免任何静态初始化命令与std :: cout的混淆并发症.)
#include <iostream>
class B {
public:
B(const std::string &s) { printf("Hello I am B from %s\n", s.c_str()); }
};
template<typename T>
class Atempl {
public:
static B b_;
};
class A {
public:
static B b_;
};
template<typename T>
B Atempl<T>::b_("Atempl");
B A::b_("A");
class C : public Atempl<int> {
};
int main(int argc, const char *argv[]) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为输出应该是:
Hello I am B from A
Hello I am B from Atempl
Run Code Online (Sandbox Code Playgroud)
但是使用FreeBSD 7.3上的g ++ …
如果抛出的异常将由某个catch块处理,有没有办法在C++中抛出核心来抛出核心?当异常达到顶级时,我想要与g ++相似的东西.
例如,我想要这样的事情:
try {
bar();
try {
foo();
} catch(...) {
# pragma dump_at_throw_site
}
} catch(...) {
std::cerr << "There was a problem" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这样,如果从foo()或其被调用者到达foo()的调用站点抛出的任何异常将导致在throw站点进行核心转储,那么可以看到是谁抛出了使其达到此级别的异常.
另一方面,bar()抛出的异常将被正常处理.