Является ли ссылочным типом в C++ тип POD? Is int&
- тип POD? и как насчетЯвляется ли ссылочным типом в C++ тип POD?
struct Q { int& i; }
Кто-нибудь может мне помочь?
Является ли ссылочным типом в C++ тип POD? Is int&
- тип POD? и как насчетЯвляется ли ссылочным типом в C++ тип POD?
struct Q { int& i; }
Кто-нибудь может мне помочь?
No.
Единственный способ установить элемент, который ссылается на то, что это через пользовательский объявленная конструктор, так что поэтому, ваша структура не-POD.
Обновление:
Ответ по-прежнему нет.
Стандарт C++ 03 указывает, что «POD-struct - это совокупный класс, который не имеет нестатических членов данных типа non-POD-struct, non-POD-union (или массив таких типов) или ссылки, и ... "(стандарт C++ 03, раздел 9, пункт 5).
В C++ 11, боб-структура «это класс, который является как тривиальный классом и класс стандартной планировки, и ...» и класс стандартного макета "не имеет не- статические элементы данных типа нестандартного макета (или массив таких типов) или ссылки "(стандарт C++ 11, раздел 9, пункт 6-9).
Я разбираю те фразы, которые заканчиваются словами «или ссылкой», чтобы сразу означать, что класс POD не может содержать нестатические элементы данных, которые имеют какой-либо ссылочный тип. Отсутствие запятой перед «или ссылкой» не уступает другим интерпретациям (например, это ссылка на класс, отличный от POD, который делает ссылку плохой, а не ссылкой как таковой), но я придерживаюсь моя интерпретация.
Не совсем, для инициализации можно использовать агрегатную инициализацию, хотя это не означает, что это POD (это не так) –
Это недостаток запятой - это противный. Не так противно, как использовать запятые из «Мне нравится готовить, моя семья и мои друзья», но все же противно. –
Существует стандартный способ (с использованием C++ 11), чтобы определить, что во время компиляции.
#include <iostream>
#include <type_traits>
struct Q
{
int& i;
};
int main()
{
std::cout << std::is_pod<int>::value << "\t";
std::cout << std::is_pod<int&>::value << "\t";
std::cout << std::is_pod<Q>::value << "\n";
}
Демонстрация: http://ideone.com/PECzfT
Выходной сигнал будет 1 0 0, так что нет ссылка на Int не СТРУЧОК.
Существует риск полагаться на определенный компилятор, поскольку у компиляторов часто есть ошибки в них, а библиотеки иногда не работают на 100% правильно. Тем не менее, спасибо за публикацию этого! – templatetypedef
Тип POD - это любой внутренний тип или совокупность собственных типов (в основном, все, что не имеет пользовательского конструктора, деструктора, конструктора копирования, оператора присваивания копий и нестатических типов указателя на элемент (более подробную информацию here)
поскольку член, который ссылается на то, должно быть установлено с помощью пользовательского конструктора, это нарушило бы первое требование. Короче говоря, структура, которая объявляет ссылочный тип в качестве члена не является тип POD.
Как уже упоминалось в другом комментарии, вам не нужен определенный пользователем конструктор, для инициализации ссылки может использоваться инициализация агрегата. Но это не меняет реального ответа: это не POD –
@ DavidRodríguez-dribeas Правда, но эффект от этого, по сути, реализует собственный конструктор-копир (который нарушает 3-й критерий). –
В одном случае, когда ссылка блокируется, не является конструкцией, а оператором присваивания. Опять же, это не делает ответ неправильным, слегка неточным. –
Вы можете проверить сами, используя тип trait 'std :: is_pod' – stefan
Я могу передать тип не-POD по ссылке. Ссылка - это метод передачи переменных, а не тип. –