Выполнение следующего кода:
#include <iostream>
#include <type_traits>
struct s_ref {
int &foo;
};
struct s_ptr {
int *foo;
};
int main(int argc, char *argv[])
{
std::cout << "s_ref is_standard_layout:" << std::is_standard_layout<struct s_ref>::value << std::endl;
std::cout << "s_ptr is_standard_layout:" << std::is_standard_layout<struct s_ptr>::value << std::endl;
return 0;
}
приводит к:
s_ref is_standard_layout:0
s_ptr is_standard_layout:1
Основываясь на использовании стандартной компоновки (то есть: "Стандартные типы макетов полезны для общения с кодом, написанным на других языках программирования" ), это имеет смысл, но я не уверен, что является нарушением правила:
Класс стандартного макета - это класс (определенный с помощью класса, структуры или союз), что:
не имеет виртуальных функций и виртуальных базовых классов.
имеет тот же контроль доступа (закрытый, защищенный, общедоступный) для всех его нестатических членов данных.
либо не имеет нестатических членов данных в самом производном классе и не более одного базового класса с нестатическими элементами данных, либо не имеет базовые классы с нестатическими членами данных.
его базовый класс (если он есть) сам по себе также является классом стандартного макета.
И не имеет базовых классов того же типа, что и его первые нестатические данные член.
Изменить: цитата из: http://www.cplusplus.com/reference/type_traits/is_standard_layout/, но http://en.cppreference.com/w/cpp/concept/StandardLayoutType также похожа.