【发布时间】:2014-08-07 22:05:24
【问题描述】:
在 C++11 中,我定义了以下一般形式的结构:
struct MyStruct
{
static void myFunc( void );
//constructors
MyStruct( void ) = delete;
};
由于默认构造函数被标记为已删除,因此无法创建 MyStruct 类型的任何对象。即使myFunc 方法也无法创建该类的实例。不过该结构仍然有用,因为 MyStruct::myFunc 是 public 并且可以从外部调用。
我现在的问题是:由于不可能创建任何MyStruct 类型的对象,编译器是否会费心为复制构造函数、地址运算符或析构函数创建代码?
顺便说一句:就我的实际代码而言,我确实必须根据静态类成员函数来实现功能,因为我必须利用部分模板类特化来模拟部分模板函数特化。所以我想知道如何才能让班级尽可能精简。
编辑:根据@Praetorian的评论和回答,删除了关于自动生成地址运算符的注释。
【问题讨论】:
-
地址操作符是什么意思?当然不是
operator&- 编译器从不自动为你生成。 -
“所以我想知道如何让类尽可能地精简” 编译器只会为那些用于 ODR 的特殊成员函数提供定义。
-
我想知道是不是 UB 欺骗了编译器:
std::aligned_storage<sizeof(MyStruct)>::type buffer; MyStruct obj = reinterpret_cast<MyStruct*>(&buffer);-- 因为对象没有成员,所以不应该发生左值到右值的转换。但这当然是愚蠢的/纯粹的学术性的。 -
@sperber 没错。 (如果你在类主体之外显式地默认一个特殊的成员函数,编译器将始终提供一个定义。但否则,只有在使用 ODR 时。)
-
@dyp 该演员表是(目前)获得
MyStruct*、default constructor deleted on its first declaration is considered trivial since it's not user-provided 的有效方式。 CWG 1496 表示这可能是语言的缺陷,但委员会尚未决定如何解决。
标签: c++ c++11 class-members