有时候我会找到类似下面的代码(实际上有些类向导会创建这样的代码):
// C.h
namespace NS {
class C {
void f();
};
}
Run Code Online (Sandbox Code Playgroud)
并在实现文件中:
// C.cpp
#include "C.h"
using namespace NS;
void C::f() {
//...
}
Run Code Online (Sandbox Code Playgroud)
我试过的所有编译器都接受那种代码(gcc,clang,msvc,compileonline.com).是什么让我感到不舒服的是using namespace NS;.从我的观点来看,C::f()生活在全局命名空间中的环境中,该环境对生活在命名空间NS中的对象具有不合格的访问权限.但是在编译器的观点中void C::f()存在namespace NS.正如我尝试的所有编译器都分享了这一观点,他们可能是正确的,但是标准中的这个意见得到了支持?
假设我有以下类模板:
template<typename T>
struct Wrapper {
T* t_;
static void check() {
static_assert(sizeof(Wrapper<T> == sizeof(T*), "Illegal assumption");
}
};
Run Code Online (Sandbox Code Playgroud)
我在C++ 03标准中查看了C99标准,并且找不到我在假设中表达的保证static_assert.我使用几个编译器选项在Visual C++ 2008和2010(32位)以及linux(64位)上使用gcc进行了尝试,并发现了我的假设.
我的问题是:
我想编译器可能会在结构中添加一些填充,例如用于调试目的.但有没有一个编译器实际上这样做?
编辑:所以你在这里问的是我想要实现的目标:
我有一个带有以下签名的成员函数:
Someclass* OtherClass::fn();
Run Code Online (Sandbox Code Playgroud)
我想改变这样的签名:
Wrapper<Someclass> OtherClass::fn();
Run Code Online (Sandbox Code Playgroud)
这个包装器就像一些智能指针,即它关心指针的生命周期,因此当它超出范围时它会释放它.当函数跨越dll边界调用时,我想确保返回的值(现在是一个具体类型,而不仅仅是一个哑指针)在与指针大小相同的所有情况下(即编译器设置等)将会.计划/希望是支持调试/发布应用程序/ dll构建的所有组合.
你可能会问:不,我不能使用boost :: shared_ptr <>,std :: shared_ptr <>,std :: unique_ptr <>等,因为我们不希望向dll用户公开boost,我们不支持C++ 11.