Тип возвращаемого значения operator?:
От: Dmi_3 Россия  
Дата: 22.10.05 12:05
Оценка:
Если двоеточием разделены выражения имеющие разный тип то каков тип результата и когда такое допустимо? Как преобразуется нОль слева и нУль справа?
Re: Тип возвращаемого значения operator?:
От: CrystaX Россия https://crystax.me/
Дата: 22.10.05 12:18
Оценка:
Здравствуйте, Dmi_3, Вы писали:

D_>Если двоеточием разделены выражения имеющие разный тип то каков тип результата и когда такое допустимо?


А такое недопустимо. Типы выражений должны быть одинаковы или приводимыми один к другому.
int main()
{
    char a, *b = &a;
    char *c = 1 ? 2 : b;
    return 0;
}


D:\Temp>g++ test.cpp
test.cpp: In function `int main()':
test.cpp:4: error: operands to ?: have different types


D_> Как преобразуется нОль слева и нУль справа?


Имеется в виду NULL? Так он в C++ определен как 0, в отличие от C, где он (char *)0 (или (void *)0, точно не помню).
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[2]: Тип возвращаемого значения operator?:
От: crable США  
Дата: 22.10.05 13:34
Оценка: 3 (3) +1
Здравствуйте, CrystaX, Вы писали:

CX>Здравствуйте, Dmi_3, Вы писали:


D_>>Если двоеточием разделены выражения имеющие разный тип то каков тип результата и когда такое допустимо?


CX>А такое недопустимо. Типы выражений должны быть одинаковы или приводимыми один к другому.

Точнее тип только одного из них должен быть однозначно приводим к другому. Кроме того, допускаются кострукции вида:

a ? b: throw c; // a приводимо к bool, b - произвольного типа (throw expression имеет тип void).
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re: Тип возвращаемого значения operator?:
От: IROV..  
Дата: 22.10.05 14:57
Оценка:
Здравствуйте, Dmi_3, Вы писали:

D_>Если двоеточием разделены выражения имеющие разный тип то каков тип результата и когда такое допустимо? Как преобразуется нОль слева и нУль справа?



// a simple type wrapper
template< class T > struct type2type {};

// convert an expression of type T to an
// expression of type type2type<T>
template< class T >
type2type< T > encode_type( T const & t )
{
  return type2type< T >();
}

// convertible to type2type<T> for any T
struct any_type
{
  template< class T >
  operator type2type< T > () const
  {
       return type2type< T >();
  }
};

// convert an expression of type T to an
// expression of type type2type<T> without
// evaluating the expression
#define ENCODED_TYPEOF( container ) \
  ( true ? any_type() : encode_type( container ) )


Код на размышление..

выдрано тут

http://www.artima.com/cppsource/foreachP.html
я не волшебник, я только учусь!
Re: Тип возвращаемого значения operator?:
От: Dmi_3 Россия  
Дата: 22.10.05 19:13
Оценка:
Не... Строчку типа

cout << typeid(true?A():B()).name() << endl;

я сам поставить могу.

struct A;
struct B{
  operator A const&() const;
};
struct A{
  operator B const&() const;
};

void main(){
  cout << typeid(false?A():B()).name() << endl;
}

Вопрос почему печатается A. Чем он лучше B ? (MSVC 7.1)
Re[2]: Тип возвращаемого значения operator?:
От: crable США  
Дата: 23.10.05 10:57
Оценка:
Здравствуйте, Dmi_3, Вы писали:

D_>Не... Строчку типа


D_>
D_>cout << typeid(true?A():B()).name() << endl;
D_>

D_>я сам поставить могу.

D_>
D_>struct A;
D_>struct B{
D_>  operator A const&() const;
D_>};
D_>struct A{
D_>  operator B const&() const;
D_>};

D_>void main(){
D_>  cout << typeid(false?A():B()).name() << endl;
D_>}
D_>

D_>Вопрос почему печатается A. Чем он лучше B ? (MSVC 7.1)
Этот код компилироваться не должен. Я уже писал: "тип только одного из выражений должен быть однозначно приводим к другому". У тебя A приводится к B, а B к A. Нужно убрать одно из преобразвоний.
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re[3]: Тип возвращаемого значения operator?:
От: Dmi_3 Россия  
Дата: 27.10.05 20:21
Оценка:
Здравствуйте, crable, Вы писали:

C>"тип только одного из выражений должен быть однозначно приводим к другому".


Из этого следует что нельзя писать такой код?
 condition ? 123 : 321. ;//int и double однозначно приводятся?


Это что-то новое для меня.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.