Я могу проверить в Clang 3.4.1 std = c ++ 11.
Вот мои выводы:
int i = f().a[0]
будет верным: вы получаете ссылку на временная структура, время жизни временного увеличивается на длительность ссылки, вы принимаете значение: fine.
int *i = &f().a[0]
принимается компилятором. Тем не менее, предупреждение f
о том, что вы возвращаете ссылку на локальный временный объект , имеет смысл здесь. Время жизни временного объекта увеличивается на время ссылки: здесь время для копирования адреса. Как только вы берете адрес a
, содержащий объект исчезает, и у вас есть только оборванная ссылка .
int *i = f().a
- это точно такой же случай, как и предыдущий.
Но когда вы делаете &f().a
, вы принимаете адрес rvalue типа 'int [3]' , и нет смысла брать такой адрес : вы можете использовать только его значение.
Давайте перейдем еще дальше:
S s = f();
верен. Вы получаете ссылку на временную структуру, время жизни временного расширения на длительность ссылки, вы принимаете значение: fine.
Теперь &s.a[0]
является четко определенным указателем на int
, as is int *ix2 = &static_cast<S&&>(s).a[0];
Вы даже можете записать: int (*ix3)[3] = &s.a;
, чтобы принять адрес массива до 3 int
, но по той же причине вы не можете написать &static_cast<S&&>(s).a
, потому что вы адрес rvalue типа 'int [3]'
TL / DR
С S s = f();
s.a
является четко определенным значением r, s.a[0]
является корректным значением lvalue (вы можете написать s.a[0] = 5;
).
f().s
является rvalue, но с его помощью будет вызываться UB, потому что он заканчивается ссылкой на временный объект, который будет быть уничтожен, прежде чем вы сможете его использовать.
f().s[0]
может использоваться как хорошо определенное значение rvalue. Вы можете использовать его как lvalue, но по той же причине, что и выше, он будет вызывать UB.
Нет, форма перекрестного браузера custimization очень тверда если не невозможный разобраться в нем для всех браузеров. Если Вы действительно заботитесь о появлении тех виджетов, необходимо использовать реализацию JavaScript.
см. http://www.456bereastreet.com/archive/200409/styling_form_controls/ и http://developer.yahoo.com/yui/examples/button/btn_example07.html
Не легко сделанный я боюсь. Проблемой является Css, не может заменить стрелку в выборе, поскольку это представляется браузером. Но можно создать новое управление из отделения и ввести элементы и JavaScript для выполнения той же функции как выбор.
Попытка, смотрящая на некоторые плагины автоматического заполнения для JQuery, например.
Иначе существует некоторая информация об избранном элементе здесь:
http://www.devarticles.com/c/a/Web-Style-Sheets/Taming-the-Select/
Нет, Вы не можете сделать этого при помощи фактического <select>
, но существуют методы, которые позволяют Вам "заменять" их решениями JavaScript тот взгляд лучше.
Вот хорошая статья о теме: < выберите> Что-то Новое
<select>
элемент сгенерирован приложением, и моделирование не является частью спецификации CSS/HTML.
необходимо было бы фальсифицировать его с собственным DIV и наложить его сверху существующего или создать собственное управление, эмулирующее ту же функциональность.
Если Вы не планируете создание Вашего собственного выпадающего списка (и не использование стандартного выпадающего списка библиотеки), Вы застреваете. Взгляд управления DDL будет основанным на системе, которую Вы выполняете и/или браузер, который представляет вывод.