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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Ferrari F1
=^_^=
562 / 449 / 94
Регистрация: 27.01.2015
Сообщений: 2,622
Записей в блоге: 1
Завершенные тесты: 1
#1

Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода? - C++

01.08.2015, 19:59. Просмотров 447. Ответов 16
Метки нет (Все метки)

Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода?
Вернее сказать, в дополнение к типу возвращаемого значения
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2015, 19:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода? (C++):

Почему тип входящего параметра функции может отличаться от типа возвращаемого значения? - C++
Зачем здесь указываеться другой тип данных: double &change_it(int i); Весь код: using namespace std; double...

Модификатор const в качестве возвращаемого значения - C++
const int get_size(const int& a) { return a; } int main() { const int size = get_size(5);

Использование int или void в качестве возвращаемого типа для main() - C++
Когда использовать int main, а когда void main?

Ссылка на массив в качестве возвращаемого результата функции - C++
Уважаемые форумчане. Нужна Ваша помощь. template<typename T, int N> class test { public: test() { a =...

Получение типа возвращаемого методом значения - C++
Есть некий класс, в классе есть метод возвращающий значение типа T. Можно ли как-то получить это самое T? Пробовал decltype, он требует...

Оператор без типа возвращаемого значения - C++
operator int (); //Тут не указывается возвращаемый тип но есть оператор return; Вот: operator int () { return fe; }

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
01.08.2015, 20:07 #2
Нет.

Добавлено через 3 минуты
В таких случаях разумнее и проще проверить самому.
Ferrari F1
=^_^=
562 / 449 / 94
Регистрация: 27.01.2015
Сообщений: 2,622
Записей в блоге: 1
Завершенные тесты: 1
01.08.2015, 20:10  [ТС] #3
castaway, имеется в виду, по аналогии, как в методе setx:
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
#include <iostream>
using std::cout;
using std::endl;
 
#include <windows.h>
 
class some
{
    int x;
public:
    some(int y = 1) : x(y)
    {}
    some* const& setx(int arg)
    {
        x = arg;
        return this;
    }
    void show(void) const
    {
        cout << x << endl;
    }
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    some* one = new some(0);
    one->setx(1)->setx(2)->setx(3)->show();
    system("pause");
    return 0;
}
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
01.08.2015, 20:13 #4
Ferrari F1, я понял.
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,272
Завершенные тесты: 3
01.08.2015, 20:17 #5
castaway, зачем так категорично?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const char* func()
{
    return "Hello world.";
}
 
#include <iostream>
 
int main()
{
    std::cout << func();
 
 
    getchar();
}
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
01.08.2015, 20:22 #6
Ferrari F1, tnk500, я старый глупый человек. Маразматик. Бывает ошибаюсь.
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,272
Завершенные тесты: 3
01.08.2015, 20:22 #7
Ferrari F1, можно, а зачем?

Добавлено через 30 секунд
castaway, да ладно тебе, просто слишком уж категорично: "нет"
Evg
Эксперт CАвтор FAQ
17634 / 5858 / 378
Регистрация: 30.03.2009
Сообщений: 16,159
Записей в блоге: 26
02.08.2015, 16:57 #8
Цитата Сообщение от tnk500 Посмотреть сообщение
castaway, зачем так категорично?
Хз, что имел в виду ТС, но в твоём примере немного не то. У тебя квалификатор находит внутри типа (т.е. указатель на const). Я воспринимаю вопрос ТС'а как возврат значения типа "const int". В этом случае в программе написать можно, но по смыслу квалификатор будет игнорироваться. Так же как и в описании параметра в декларации (не определении) функции

C
const int foo (void); /* const игнорируется */
void bar (const int); /* const игнорируется */
DrOffset
7102 / 4243 / 952
Регистрация: 30.01.2014
Сообщений: 7,025
02.08.2015, 17:19 #9
Цитата Сообщение от Evg Посмотреть сообщение
В этом случае в программе написать можно, но по смыслу квалификатор будет игнорироваться.
Игнорироваться он будет при разрешении перегрузки, если указан в параметре.
Но в С++ вполне можно написать код, который по смыслу будет зависеть от этого const.
Вот например с возвращаемым значением.
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
struct A
{
    void foo()
    {
        std::cout << "nonconst foo\n";
    }
    void foo() const
    {
        std::cout << "const foo\n";
    }
    
};
 
A foo()
{
    return A();
}
 
const A bar()
{
    return A();
}
 
int main()
{
    foo().foo();
    bar().foo();
}
http://rextester.com/TDO9003
Evg
Эксперт CАвтор FAQ
17634 / 5858 / 378
Регистрация: 30.03.2009
Сообщений: 16,159
Записей в блоге: 26
02.08.2015, 17:53 #10
Такое ощущение, что в этом примере const уже не квалификатором является, а хз знает чем (как любят в Си++ переиспользовать существующие токены)
DrOffset
7102 / 4243 / 952
Регистрация: 30.01.2014
Сообщений: 7,025
02.08.2015, 18:08 #11
Цитата Сообщение от Evg Посмотреть сообщение
Такое ощущение, что в этом примере const уже не квалификатором является, а хз знает чем
Да нет, квалификатор как есть. Просто в С++ есть перегрузка по const. И разрешение вызова такой функции, зависит от константности объекта. Если говорить строго, то нижеследующий код не совсем тоже самое, но в рассматриваемом вопросе он точно передает смысл предыдущего примера:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct A
{
    A() {}
};
 
void foo(A const * self)
{
    std::cout << "const foo\n";
}
 
void foo(A * self)
{
    std::cout << "nonconst foo\n";
}
 
int main()
{
    A a1;
    foo(&a1);
    
    const A a2;
    foo(&a2);
}
http://rextester.com/KLXI42518

Добавлено через 3 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Игнорироваться он будет при разрешении перегрузки, если указан в параметре.
На всякий случай поясню, я имел в в виду, что такие функции при перегрузке будут неотличимы:
C++
1
2
void foo(const A a);
void foo(A a); // compiler error: redefinition of 'foo'
hoggy
6545 / 2725 / 471
Регистрация: 15.11.2014
Сообщений: 6,016
Завершенные тесты: 1
02.08.2015, 18:09 #12
Цитата Сообщение от Evg Посмотреть сообщение
Такое ощущение, что в этом примере const уже не квалификатором является, а хз знает чем (как любят в Си++ переиспользовать существующие токены)
возвращается самый что ни на есть настоящий константный pvalue

http://ideone.com/zcTmVV

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <type_traits>
#include <iostream>
 
 
struct some{};
 
 
const some foo() { some s; return s; }
 
int main()
{
    std::cout << "Hello, world!\n";
    
    
    if (std::is_const< decltype(foo() )  >::value)
        std::cout << "returned const type\n";
    else
        std::cout << "returned non const type\n";
}
Evg
Эксперт CАвтор FAQ
17634 / 5858 / 378
Регистрация: 30.03.2009
Сообщений: 16,159
Записей в блоге: 26
02.08.2015, 18:32 #13
Цитата Сообщение от DrOffset Посмотреть сообщение
Если говорить строго, то нижеследующий код не совсем тоже самое, но в рассматриваемом вопросе он точно передает смысл предыдущего примера
Тут-то как раз понятно. Указатель и константный указатель - это разные типы. В первом твоём примере методы foo различались наличием у одного из них const на конце. Я знаю, что эта конструкция означает, но не знаю, как правильно называется. Но это, как мне кажется, НЕ есть "квалификатор типа"

Цитата Сообщение от DrOffset Посмотреть сообщение
На всякий случай поясню, я имел в в виду, что такие функции при перегрузке будут неотличимы
А вот здесь уже квалификатор типа. И он в этом месте игнорируется с точки зрения описания прототипа

Цитата Сообщение от hoggy Посмотреть сообщение
возвращается самый что ни на есть настоящий константный pvalue
Опять-таки я не знаю, как это правильно называется. Это "квалификатор типа" или "квалификатор значения" (или как оно называется)?
DrOffset
7102 / 4243 / 952
Регистрация: 30.01.2014
Сообщений: 7,025
02.08.2015, 18:39 #14
Цитата Сообщение от Evg Посмотреть сообщение
Тут-то как раз понятно. Указатель и константный указатель - это разные типы. В первом твоём примере методы foo различались наличием у одного из них const на конце.
Наличие этого "const на конце" как раз делает неявный this (во втором примере self) указателем на константу или не на константу. Так что если понятен второй пример, то и первый теперь тоже должен проясниться.
hoggy
6545 / 2725 / 471
Регистрация: 15.11.2014
Сообщений: 6,016
Завершенные тесты: 1
02.08.2015, 19:10 #15
Цитата Сообщение от Evg Посмотреть сообщение
Это "квалификатор типа" или "квалификатор значения" (или как оно называется)?
квалификатор типа.

запись:
C++
1
const some foo() { some s; return s; }
означает, что результат работы функции - это объект const some,
который должен быть проинициализирован значением локального объекта s.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2015, 19:10
Привет! Вот еще темы с ответами:

Определение типа возвращаемого значения лямбда-выражения - C++
Вообщем не совсем понимаю в каких случаях надо использовать замыкающий тип возвращаемого выражения. У липпмана написано что данный пример...

Могут ли значения быть сторонами треугольника? - C++
Есть задача: А если они не равны нулю, то даже если каждая будет равна 1, они все равно смогут быть сторонами треугольника....

Тип возвращаемого значения функции - C++
есть класс point. в другом классе есть член функция point GetUpperLeft() { return itsUpperLeft; } эта член-функция исходя из типа...

Напишите функцию Swap(a, b), аргументами которой могут быть числа любого типа - C++
Напишите функцию Swap(a, b), аргументами которой могут быть числа любого типа. Функция меняет значения своих аргументов и не возвращает...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.08.2015, 19:10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru