C++0x: условный оператор, xvalues ​​и decltype

Я повторно публикую comp.std.c++ Обсуждение Usenet здесь, потому что эта группа стала очень ненадежной. Последние несколько постов, которые я туда отправил, ушли в пустоту, и активность почти прекратилась. Сомневаюсь, что меня забанили и/или все остальные просто потеряли интерес. Надеюсь все желающие найдут это обсуждение, и будет вообще миграция. Может тогда назначат нового модератора.


Привет!

С моей текущей интерпретацией проекта N3126 w.r.t. условный оператор и значения x, я ожидаю, что будут выполнены следующие утверждения:

 int i = 0;
 int& j = true? i : i;
 int&& k = true? std::move(i) : std::move(i);   // #2
 assert(&i == &j); // Holds since C++98
 assert(&i == &k); // Should this hold as well?

5.16/4 говорит:

Если второй и третий операнды [условного оператора] являются glvalues ​​одной и той же категории значений и имеют один и тот же тип, результат имеет тот же тип и категорию значений [...]

Тем не менее, это не говорит ясно, что результирующее glvalue относится к одному из объектов, на которые ссылаются операнды glvalue, или это подразумевается, потому что в противном случае он вернул бы prvalue? При использовании GCC 4.5.1 в режиме C++0x второе утверждение не выполняется. Ссылка k, по-видимому, относится к какому-то временному объекту. Может ли кто-нибудь уточнить, разрешено ли компилятору создавать такое временное в случае, если оба операнда вокруг двоеточия являются значениями x одного и того же типа?

В настоящее время я предполагаю, что GCC глючит и/или не обновляется в отношении значений xvalue.

Следующий вопрос: было бы неплохо иметь возможность определять категорию значения выражения? Если мы проигнорируем условный оператор, мы сможем определить категорию значения выражения с decltype. Но что такое

 bool xvalue = std::is_rvalue_reference<
   decltype( true ? std::move(i) : std::move(i) ) >::value;

должен уступать? При использовании GCC 4.5.1 переменная xvalue инициализируется значением false. Соответствует ли это текущему стандартному проекту?

Тиа, Себастьян


person Community    schedule 11.10.2010    source источник
comment
Я думаю, вы имеете в виду [comp.std.c++], как следует из вашей ссылки. Да, у него есть некоторое время задержки, но я думаю, вы, возможно, только что столкнулись с недавним отключением Google. Вы размещали сообщения через группы Google?   -  person Cheers and hth. - Alf    schedule 12.10.2010
comment
@Alf: я публикую сообщения в группах Google, но разве это не повлияет на все группы? На comp.std.c++ с сентября практически нет активности, чего нельзя сказать о немодерируемых группах.   -  person Potatoswatter    schedule 12.10.2010
comment
Отсюда c.l.c++ имеет 30 сообщений для моего локального сегодня, c.s.c++ имеет два (одно из них от SG, который, кажется, вы), и еще пять сообщений ранее от других людей в этом месяце.   -  person sbi    schedule 12.10.2010
comment
@sbi: я Дэвид Краусс на comp.lang.c++ (и в реальной жизни); этот пост является вики сообщества, потому что я делаю репост от чьего-то имени. comp.lang.c++ не модерируется, поэтому он более активен, потому что модератор не спит за рулем. comp.std.c++ имеет семь сообщений за октябрь против десятков за сентябрь, потому что модератор почти ушел. Я не знаю, почему и как ему удается пропускать такую ​​маленькую, но ненулевую струйку.   -  person Potatoswatter    schedule 12.10.2010
comment
Поскольку comp.std.c++ является полуофициальным каналом для отправки отчетов о дефектах, я создал тег c++-defect, чтобы соответствовать такого рода вещам. Может быть, можно организовать процесс направления вопросов комитету после их проверки.   -  person Potatoswatter    schedule 12.10.2010
comment
Предположительно есть пять модераторов. Вы пытались связаться с ними ([email protected])?   -  person James McNellis    schedule 12.10.2010
comment
@James: Нет, я не их босс и не активист, по крайней мере, не в рамках комитета ISO (до тех пор, пока они меня не узнают, я полагаю). Если они не хотят выполнять свою работу, и если сообщество может обойтись без них, они вправе не делать этого. Но совершенно очевидно, что это не так.   -  person Potatoswatter    schedule 12.10.2010
comment
Справедливо. Что бы это ни стоило, есть инструкции о том, как отправить дефект библиотеки на страница дефектов LWG в основном говорит о том, что нужно просто отправить электронное письмо Алисдеру Мередит, председателю LWG (Говард Хиннант, который был председателем LWG до сентября, сказал, что он не получил уведомления от модераторов группы новостей в несколько лет). Что касается языковых дефектов, страница дефектов CWG просто ссылается на часто задаваемые вопросы comp.std.c++ о том, как сообщить о дефекте; Я полагаю, что не помешает написать Майку Миллеру по электронной почте, чтобы узнать, как лучше всего доставить им дефекты.   -  person James McNellis    schedule 12.10.2010
comment
@Джеймс: Ага. Если уж на то пошло, за последний месяц я отправил Alisdair 3 письма без ответа. Вероятно, потому, что они состоят из незначительного исправления орфографии, исправления оборванной ссылки и запроса на специализацию std::tuple_element и tuple_size на bitset. Так что я не слишком беспокоюсь. Но отправка подробного двухстраничного ответа на comp.std.c++ очень похожа на то, чтобы просто заполнить чей-то спам-фильтр.   -  person Potatoswatter    schedule 12.10.2010
comment
Вы также можете написать Питу Беккеру по электронной почте ([email protected]) с типографскими и редакционными ошибками (например, с орфографической ошибкой). Весь процесс сообщения о дефектах слишком запутан, ИМО. Было бы неплохо, если бы у комитета был Bugzilla или Trac или что-то, что упрощало бы сообщение о проблемах (конечно, они, вероятно, сказали бы, что правильный способ сообщить о дефектах — это присоединиться к комитету, но плата в размере 1200 долларов в год — это слишком дорого). немного круто для этой привилегии).   -  person James McNellis    schedule 12.10.2010
comment
@James McNellis: Вы не можете присоединиться к комитету напрямую; Членами ISO являются национальные организации (в вашем случае INCITS (США)) и национальные организации обычно имеют членство в компаниях. В вашем профиле указано, что вы работаете в Microsoft, которая уже заплатила взнос INCITS и активно работает в комитете ISO.   -  person MSalters    schedule 12.10.2010
comment
@MSalters: я имел в виду это полушутя; каждый раз, когда я взаимодействовал с членами комитета, они были очень полезны. Так или иначе, в общем, если кто-то хотел официально участвовать, он должен был присоединиться; для тех, кто находится в США, плата за присоединение к INCITS J16 составляет 1200 долларов США в год. Я знаю, что если бы я хотел и имел время участвовать, я, вероятно, мог бы сделать это через своего работодателя, но у многих людей нет такой возможности. Конечно, наличие высокого барьера для входа, вероятно, снижает уровень шума, что обычно хорошо.   -  person James McNellis    schedule 12.10.2010


Ответы (1)


Я думаю, что GCC 4.5.1 не соответствует §5.16/4. Вы подавали отчет об ошибке?

Во всяком случае, я думаю, что это соответствует коду троичного оператора. decltype определяется в §7.1.6.2/4:

Тип, обозначаемый decltype(e), определяется следующим образом:

  • если e является выражением id без скобок или доступом к члену класса (5.2.5), decltype(e) является типом объекта, названного e. Если такой сущности нет или если e называет набор перегруженных функций, программа плохо сформирована;
  • в противном случае, если e является вызовом функции (5.2.2) или вызовом перегруженного оператора (круглые скобки вокруг e игнорируются), decltype(e) является возвращаемым типом статически выбранной функции;
  • в противном случае, если e — это lvalue, decltype(e) — это T&, где T — это тип e;
  • в противном случае decltype(e) является типом e. Операнд спецификатора decltype является необработанным операндом (раздел 5).

decltype работает, извлекая соответствующее объявление и возвращая из него желаемый тип. У него мало интеллекта по отношению к не перегруженным операторам. Возможно еще один момент

  • в противном случае, если e является значением x, decltype(e) равно T&&, где T является типом e

было бы уместно, особенно потому, что, как написано, значения x рассматриваются как значения prvalue. Кроме того, ваше выражение точно соответствует определению std::common_type (§20.7.6.6/3).

Один простой обходной путь (чтобы придумать фразу :vP ):

template< typename T1, typename T2 >
struct common_type_and_category {
    typedef typename std::conditional<
        std::is_same< T1, T2 >::value,
        T1,
        typename std::common_type< T1, T2 >::type
    >::type type;
};
person Community    schedule 11.10.2010