#include <iostream>
template <typename theType, size_t theSize>
char (& AsArray(theType (&) [theSize])) [theSize];
int main(int argc, char * argv[])
{
struct { int i; double d; } array[10];
double * notAnArray;
// Funktioniert.
std::cout << sizeof(AsArray(array)) << std::endl;
// Funktioniert.
std::cout << sizeof(array) / sizeof(array[0]) << std::endl;
// Funktioniert nicht; soll es auch nicht!
// std::cout << sizeof(AsArray(notAnArray)) << std::endl;
// Funktioniert; undefiniertes Verhalten.
std::cout << sizeof(notAnArray) / sizeof(notAnArray[0]) << std::endl;
return 0;
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnRlbXBsYXRlIDx0eXBlbmFtZSB0aGVUeXBlLCBzaXplX3QgdGhlU2l6ZT4KY2hhciAoJiBBc0FycmF5KHRoZVR5cGUgKCYpIFt0aGVTaXplXSkpIFt0aGVTaXplXTsKCmludCBtYWluKGludCBhcmdjLCBjaGFyICogYXJndltdKQp7CglzdHJ1Y3QgeyBpbnQgaTsgZG91YmxlIGQ7IH0gYXJyYXlbMTBdOwoJZG91YmxlICogbm90QW5BcnJheTsKCgkvLyBGdW5rdGlvbmllcnQuCglzdGQ6OmNvdXQgPDwgc2l6ZW9mKEFzQXJyYXkoYXJyYXkpKSA8PCBzdGQ6OmVuZGw7CgoJLy8gRnVua3Rpb25pZXJ0LgoJc3RkOjpjb3V0IDw8IHNpemVvZihhcnJheSkgLyBzaXplb2YoYXJyYXlbMF0pIDw8IHN0ZDo6ZW5kbDsKCgkvLyBGdW5rdGlvbmllcnQgbmljaHQ7IHNvbGwgZXMgYXVjaCBuaWNodCEKCS8vIHN0ZDo6Y291dCA8PCBzaXplb2YoQXNBcnJheShub3RBbkFycmF5KSkgPDwgc3RkOjplbmRsOwoKCS8vIEZ1bmt0aW9uaWVydDsgdW5kZWZpbmllcnRlcyBWZXJoYWx0ZW4uIAoJc3RkOjpjb3V0IDw8IHNpemVvZihub3RBbkFycmF5KSAvIHNpemVvZihub3RBbkFycmF5WzBdKSA8PCBzdGQ6OmVuZGw7CgoJcmV0dXJuIDA7Cn0=