805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
1

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

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

Author24 — интернет-сервис помощи студентам
Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода?
Вернее сказать, в дополнение к типу возвращаемого значения
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.08.2015, 19:59
Ответы с готовыми решениями:

Использование типа void в качестве возвращаемого значения функцией main
Здравствуйте. Надеюсь получить внятный ответ на то, почему все категорически рекомендуют...

Несовместимость по доступности типа возвращаемого значения и метода
Добрий день всем. У меня высвечивает ошибку: Несовместимость по доступности: доступность типа...

Почему ковариантный тип может быть только типом возвращаемого значения метода?
Почему ковариантный тип T может быть только типом возвращаемого значения метода? Вот мои мысли: 1)...

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

16
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
01.08.2015, 20:07 2
Нет.

Добавлено через 3 минуты
В таких случаях разумнее и проще проверить самому.
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 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;
}
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
01.08.2015, 20:13 4
Ferrari F1, я понял.
0
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
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();
}
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
01.08.2015, 20:22 6
Ferrari F1, tnk500, я старый глупый человек. Маразматик. Бывает ошибаюсь.
0
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
01.08.2015, 20:22 7
Ferrari F1, можно, а зачем?

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

C
const int foo (void); /* const игнорируется */
void bar (const int); /* const игнорируется */
0
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,269
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
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.08.2015, 17:53 10
Такое ощущение, что в этом примере const уже не квалификатором является, а хз знает чем (как любят в Си++ переиспользовать существующие токены)
0
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,269
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'
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
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";
}
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.08.2015, 18:32 13
Цитата Сообщение от DrOffset Посмотреть сообщение
Если говорить строго, то нижеследующий код не совсем тоже самое, но в рассматриваемом вопросе он точно передает смысл предыдущего примера
Тут-то как раз понятно. Указатель и константный указатель - это разные типы. В первом твоём примере методы foo различались наличием у одного из них const на конце. Я знаю, что эта конструкция означает, но не знаю, как правильно называется. Но это, как мне кажется, НЕ есть "квалификатор типа"

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

Цитата Сообщение от hoggy Посмотреть сообщение
возвращается самый что ни на есть настоящий константный pvalue
Опять-таки я не знаю, как это правильно называется. Это "квалификатор типа" или "квалификатор значения" (или как оно называется)?
0
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,269
02.08.2015, 18:39 14
Цитата Сообщение от Evg Посмотреть сообщение
Тут-то как раз понятно. Указатель и константный указатель - это разные типы. В первом твоём примере методы foo различались наличием у одного из них const на конце.
Наличие этого "const на конце" как раз делает неявный this (во втором примере self) указателем на константу или не на константу. Так что если понятен второй пример, то и первый теперь тоже должен проясниться.
1
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
02.08.2015, 19:10 15
Цитата Сообщение от Evg Посмотреть сообщение
Это "квалификатор типа" или "квалификатор значения" (или как оно называется)?
квалификатор типа.

запись:
C++
1
const some foo() { some s; return s; }
означает, что результат работы функции - это объект const some,
который должен быть проинициализирован значением локального объекта s.
1
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
02.08.2015, 20:07 16
Evg, а вот поэтому я и написал "Зачем?" в сообщении выше твоего

Добавлено через 5 минут
Хотя смысл некоторый есть
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.08.2015, 23:42 17
Цитата Сообщение от DrOffset Посмотреть сообщение
Наличие этого "const на конце" как раз делает неявный this
При такой постановке вопроса согласен

Цитата Сообщение от hoggy Посмотреть сообщение
означает, что результат работы функции - это объект const some
Тут тоже согласен
0
02.08.2015, 23:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2015, 23:42
Помогаю со студенческими работами здесь

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

непонятки с QVector в качестве возвращаемого значения
Приветствую! Есть класс базы данных, у которой необходимо реализовать метод возвращающий QVector...

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

Пользовательский тип данных в качестве возвращаемого значения свойством
Добрый день. Подскажите в чем проблема. Есть процедура, которая должна возвращать пользовательский...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru