Форум программистов, компьютерный форум CyberForum.ru

decltype с тернарным оператором - C++

Восстановить пароль Регистрация
 
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
16.09.2013, 13:48     decltype с тернарным оператором #1
Почему в данном коде функция foo всегда работает нормально, а max работает только с int-ами?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
 
template<typename T>
auto foo(T&& t) -> decltype(t)
{
   return t;
}
 
template<typename T, typename U>
auto max(T&& t, U&& u) -> decltype(t > u ? t : u)
{
   return t > u ? t : u;
}
 
int main()
{
   int x = 10;
   int y = 20;
   double z = 30.5;
 
   foo(x) = 100.2; //Ok
   foo(z) = 100.2; //Ok
 
   max(x, y) = 110.2; //Ok
   //max(x, z) = 110.2; //Error
   //max(x, 5.2) = 110.2; //Error
   max(x, 2) = 110.2; //Ok
 
   std::cout << "x = " << x << std::endl;
   std::cout << "y = " << y << std::endl;
   std::cout << "z = " << z << std::endl;
 
   return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2013, 13:48     decltype с тернарным оператором
Посмотрите здесь:

C++ Функция с оператором
C++ Ошибка с оператором
C++ переменные с оператором If
решить с оператором while C++
C++ Задача с оператором if
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.09.2013, 14:26     decltype с тернарным оператором #2
DiffEreD, Тернарный оператор возвращает значение, а не копию, если может это сделать, однако если типы разные - понадобиться преобразование и возвращена будет копия значения, к которой соответственно ничего нельзя присвоить.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
16.09.2013, 14:33  [ТС]     decltype с тернарным оператором #3
Типа так:
C++
1
2
3
4
5
template<typename T, typename U>
typename std::common_type<T, U>::type max(T&& t, U&& u)
{
   return t > u ? t : u;
}
Это не работает.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.09.2013, 14:35     decltype с тернарным оператором #4
DiffEreD, Я собственно был не прав и тут же поправился. common_type тут ни при чем.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
16.09.2013, 14:38  [ТС]     decltype с тернарным оператором #5
Я еще такой вариант пробовал, но тоже, безрезультатно:
C++
1
decltype(t > u ? std::forward<T>(t) : std::forward<U>(u))
Похоже decltype в этом случае не применимо.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.09.2013, 14:52     decltype с тернарным оператором #6
DiffEreD, Просто идет возврат не ссылки, типы же разные, следовательно одно значение должно быть приведено к другому.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2013, 15:03     decltype с тернарным оператором
Еще ссылки по теме:

C++ Decltype и typeof
C++ Стивен Прата - про decltype (гл. 8, стр. 422)
Работа с оператором for C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
16.09.2013, 15:03  [ТС]     decltype с тернарным оператором #7
Понял.
Yandex
Объявления
16.09.2013, 15:03     decltype с тернарным оператором
Ответ Создать тему
Опции темы

Текущее время: 11:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru