【发布时间】:2015-09-04 13:26:57
【问题描述】:
我不明白为什么为类添加前向声明会更改其指向成员类型的指针的大小
#include <iostream>
using namespace std;
int main()
{
//struct CL;
//cout<<sizeof(int (CL::*)())<<endl;
struct CL{};
cout<<sizeof(int (CL::*)())<<endl;
}
输出VS2013:
4
但如果我取消注释 main() 中的前两行,则输出会有所不同:
16
16
因此,只需在 struct CL 的定义之前简单地添加前向声明,就会增加指向 CL 成员的指针的大小。为什么?我知道成员函数指针的大小取决于类型的结构(例如,虚函数和基类可能会增加它),但是为什么 sizeof 运算符可以应用于指向不完整类型成员的指针?还是不能?我在标准中没有找到它
【问题讨论】:
-
struct CL{}绝对是函数中的本地类。不确定struct CL;反正好像是msvc的bug -
@DieterLücking
struct CL;在这种情况下是本地类的前向声明,请参阅 [basic.scope.pdecl]p7.1 -
@dyp 这是讨厌 msvc 的另一个原因吗?
-
@DieterLücking 这是正确设置它的另一个原因 ;) 就像 g++ 中的
-Wall -Wextra -pedantic -std=c++??一样,您需要停用 cl 中的语言扩展,可能停用 comdat 折叠,并强制它使用相同的所有成员指针的大小。
标签: c++ incomplete-type pointer-to-member