2013-10-02 2 views
7

Является ли ссылочным типом в C++ тип POD? Is int& - тип POD? и как насчетЯвляется ли ссылочным типом в C++ тип POD?

struct Q { int& i; } 

Кто-нибудь может мне помочь?

+2

Вы можете проверить сами, используя тип trait 'std :: is_pod' – stefan

+0

Я могу передать тип не-POD по ссылке. Ссылка - это метод передачи переменных, а не тип. –

ответ

9

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, который делает ссылку плохой, а не ссылкой как таковой), но я придерживаюсь моя интерпретация.

+0

Не совсем, для инициализации можно использовать агрегатную инициализацию, хотя это не означает, что это POD (это не так) –

+0

Это недостаток запятой - это противный. Не так противно, как использовать запятые из «Мне нравится готовить, моя семья и мои друзья», но все же противно. –

6

Существует стандартный способ (с использованием 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 не СТРУЧОК.

+0

Существует риск полагаться на определенный компилятор, поскольку у компиляторов часто есть ошибки в них, а библиотеки иногда не работают на 100% правильно. Тем не менее, спасибо за публикацию этого! – templatetypedef

4

Тип POD - это любой внутренний тип или совокупность собственных типов (в основном, все, что не имеет пользовательского конструктора, деструктора, конструктора копирования, оператора присваивания копий и нестатических типов указателя на элемент (более подробную информацию here)

поскольку член, который ссылается на то, должно быть установлено с помощью пользовательского конструктора, это нарушило бы первое требование. Короче говоря, структура, которая объявляет ссылочный тип в качестве члена не является тип POD.

+0

Как уже упоминалось в другом комментарии, вам не нужен определенный пользователем конструктор, для инициализации ссылки может использоваться инициализация агрегата. Но это не меняет реального ответа: это не POD –

+0

@ DavidRodríguez-dribeas Правда, но эффект от этого, по сути, реализует собственный конструктор-копир (который нарушает 3-й критерий). –

+0

В одном случае, когда ссылка блокируется, не является конструкцией, а оператором присваивания. Опять же, это не делает ответ неправильным, слегка неточным. –

Смежные вопросы