2

clone()对以下示例中的方法有疑问。我预计这sizeof(*((*ptr1).clone()))将与大小相同,b1但它们不是。他们是。我错过了什么?sizeof(*(ptr2.clone()))c1sizeof(a1)

这是代码。

class A
{int a;
public:
    virtual A * clone() {return this;}
};

class B : public A
{int b,c;
public:
    B * clone() {return this;}
};

class C : public A
{int b,c,d;
public:
    C * clone() {return this;}
};

int main()
{
    A a1;
    B b1;
    C c1;
    A * ptr1 = &b1;
    A & ptr2 = c1;
    std::cout << "sizeof(a1) = " << sizeof(a1) << '\n';
    std::cout << "sizeof(b1) = " << sizeof(b1) << '\n';
    std::cout << "sizeof(*(b1.clone())) = " << sizeof(*(b1.clone())) << '\n';
    std::cout << "sizeof(c1) = " << sizeof(c1) << '\n';
    std::cout << "sizeof(*((*ptr1).clone()))" << sizeof(*((*ptr1).clone())) << '\n';
    std::cout << "sizeof(*(ptr2.clone()))" << sizeof(*(ptr2.clone())) << '\n';
    return 0;
}
4

2 回答 2

2

sizeof(*((*ptr1).clone()))是编译时值,不执行表达式。

所以这里我们有sizeof(*((*std::declval<A*>()).clone()))which is sizeof(A)(我们使用A::clone()which returns A*)。

于 2015-08-21T12:30:56.413 回答
1

sizeof只考虑其参数的静态类型,而不考虑动态类型。因此,参数 tosizeof可以是未计算的操作数,并且结果sizeof不依赖于任何运行时信息(例如动态类型信息所需的 vtables)。因此 的结果sizeof始终是编译时常量表达式,适合用作例如模板参数。

参见 C++11:§5.3.3 [expr.sizeof]/2。

于 2015-08-21T12:42:01.953 回答