64,641
社区成员
发帖
与我相关
我的任务
分享
以下的三个帖子涉及的话题可能有点老了(之间可能还有点联系),不过还是希望高手帮忙,不欢迎水帖
(所有的程序均运行于 VS 2008 下)
一、不使用 virtual 实现的 多态析构 (挺吸引人的)
注意:如果取消注释的部分,即添加了构造函数,生成对象的数量会减少,应该是编译器做的优化,本人想知道 什么书 会介绍这些 特性?其次是上述提到的优化可以禁止吗?
#include <iostream>
//#define CONSTRUCTOR_DEFINED
struct Base
{
#if defined CONSTRUCTOR_DEFINED
Base() {}
#endif
~Base() // note: it's not virtual
{ std::cout << "Base destroyed" << std::endl; }
};
struct Derived : Base
{
~Derived()
{ std::cout << "Derived destroyed" << std::endl; }
};
int main()
{
const Base &b = Derived();
return 0;
}
结帖,谢谢各位了
第一题:有兴趣的,可以参阅 C++ View 第5期 简化异常安全代码 中关于 ScopeGuard 的
实现
第二题:以 ri_aje 提够的标准论述作为 合法的 解释
第三题:原因不明,猜测编译器是 将ERROR_##msg() 视为一个指针
现改用 稻草人 函数
#define STATIC_CHECK(expr, msg)\
{\
struct ERROR_##msg makeT(); \
(void)sizeof(CompileTimeChecker<(expr)>(MakeT()));\
}
5、若并不发生在try 区段内,或者没有匹配的catch 子句,那么系统必须
a、摧毁所有的 active local object
b、从堆栈中将当前的函数 unwind 掉
c、进行到程序堆栈中的下一个函数中去,然后重复 2——5。
STATIC_CHECK(1 > 2, 1_should_be_less_than_2);
不好意思,问题 3 的代码有问题,更正如下
template<bool>
struct CompileTimeChecker
{
CompileTimeChecker(...);
};
template<> struct CompileTimeChecker<false> {};
#define STATIC_CHECK(expr, msg)\
{\
class ERROR_##msg {}; \
(void)sizeof(CompileTimeChecker<(expr)>(ERROR_##msg()));\
}
出现的错误是:
error C2066: 转换到函数类型是非法的
error C2070: “CompileTimeChecker<false> (main::ERROR_test (__cdecl *)(void))”:
非法的 sizeof 操作数