2010-10-11 2 views
3

Я переписываю comp.std.c++ Usenet discussion здесь, потому что эта группа стала очень ненадежной. Последние несколько сообщений, которые я там отправил, попали в пустоту, и деятельность почти прекратилась. Я сомневаюсь, что меня запретили, и/или все остальные просто потеряли интерес. Надеемся, что все заинтересованные люди найдут эту дискуссию, и будет общая миграция. Может быть, тогда они назначат нового модератора.C++ 0x: условный оператор, xvalues ​​и decltype


Hello!

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

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 неисправен и/или не обновлен с уважением до значений xvalues.

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

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

Предполагаемый выход? Используя GCC 4.5.1, переменная xvalue инициализируется с ложным. Соответствует ли это действующему стандарту?

ТИА, Sebastian

+0

Я думаю, вы имеете в виду [comp.std.C++], как следует из вашей ссылки. Да, у него есть некоторое время задержки, но я думаю, что вы, возможно, только что столкнулись с недавним отключением Google. Вы отправляли сообщения через группы Google? –

+0

@Alf: Я публикую группы Google, но не повлияет ли это на все группы? Практически нет активности на comp.std.C++ с сентября, а не для немодерированных групп. – Potatoswatter

+0

Отсюда c.l.C++ имеет 30 сообщений для моего локального «today», c.s.C++ имеет два (один из них из «SG», который вам кажется) и еще пять сообщений для ранее других людей в этом месяце. – sbi

ответ

2

Я думаю, GCC 4.5.1 является несоответствующей WRT §5.16/4. У вас есть filed a bug report?

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

тип обозначается decltype (е) является определяется следующим образом:

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

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

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

будет в порядке, в частности, так, как написано, xvalues ​​получить обрабатываются как prvalues. Кроме того, ваше выражение точно соответствует определению 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; 
};