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

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

Восстановить пароль Регистрация
 
Ferrari F1
Заблокирован
298 / 284 / 62
Регистрация: 27.01.2015
Сообщений: 1,914
Записей в блоге: 1
Завершенные тесты: 1
01.08.2015, 19:59     Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода? #1
Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода?
Вернее сказать, в дополнение к типу возвращаемого значения
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2015, 19:59     Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода?
Посмотрите здесь:

Могут ли значения быть сторонами треугольника? C++
C++ Функции (вызов и тип возвращаемого значения)
C++ Напишите функцию Swap(a, b), аргументами которой могут быть числа любого типа
C++ Почему в setnamedisc нужно использовать char * для установки значения, а при возвращении значения тип метода должен быть char* ?
C++ Какие подводные камни могут быть, при хранении в контейнере элемента типа void*?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
01.08.2015, 20:07     Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода? #2
Нет.

Добавлено через 3 минуты
В таких случаях разумнее и проще проверить самому.
Ferrari F1
Заблокирован
298 / 284 / 62
Регистрация: 27.01.2015
Сообщений: 1,914
Записей в блоге: 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
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
01.08.2015, 20:13     Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода? #4
Ferrari F1, я понял.
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,216
Завершенные тесты: 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
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
01.08.2015, 20:22     Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода? #6
Ferrari F1, tnk500, я старый глупый человек. Маразматик. Бывает ошибаюсь.
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,216
Завершенные тесты: 3
01.08.2015, 20:22     Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода? #7
Ferrari F1, можно, а зачем?

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

C
const int foo (void); /* const игнорируется */
void bar (const int); /* const игнорируется */
DrOffset
6459 / 3833 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
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
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,139
Записей в блоге: 26
02.08.2015, 17:53     Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода? #10
Такое ощущение, что в этом примере const уже не квалификатором является, а хз знает чем (как любят в Си++ переиспользовать существующие токены)
DrOffset
6459 / 3833 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
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
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 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
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,139
Записей в блоге: 26
02.08.2015, 18:32     Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода? #13
Цитата Сообщение от DrOffset Посмотреть сообщение
Если говорить строго, то нижеследующий код не совсем тоже самое, но в рассматриваемом вопросе он точно передает смысл предыдущего примера
Тут-то как раз понятно. Указатель и константный указатель - это разные типы. В первом твоём примере методы foo различались наличием у одного из них const на конце. Я знаю, что эта конструкция означает, но не знаю, как правильно называется. Но это, как мне кажется, НЕ есть "квалификатор типа"

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

Цитата Сообщение от hoggy Посмотреть сообщение
возвращается самый что ни на есть настоящий константный pvalue
Опять-таки я не знаю, как это правильно называется. Это "квалификатор типа" или "квалификатор значения" (или как оно называется)?
DrOffset
6459 / 3833 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
02.08.2015, 18:39     Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода? #14
Цитата Сообщение от Evg Посмотреть сообщение
Тут-то как раз понятно. Указатель и константный указатель - это разные типы. В первом твоём примере методы foo различались наличием у одного из них const на конце.
Наличие этого "const на конце" как раз делает неявный this (во втором примере self) указателем на константу или не на константу. Так что если понятен второй пример, то и первый теперь тоже должен проясниться.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
02.08.2015, 19:10     Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода? #15
Цитата Сообщение от Evg Посмотреть сообщение
Это "квалификатор типа" или "квалификатор значения" (или как оно называется)?
квалификатор типа.

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

Добавлено через 5 минут
Хотя смысл некоторый есть
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2015, 23:42     Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода?
Еще ссылки по теме:

Тип возвращаемого значения не соответствует типу функции C++
Что происходит раньше - копирование возвращаемого значения из функции или освобождение ресурсов? C++
C++ Передача объекта в качестве аргумента функции (метода)

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,139
Записей в блоге: 26
02.08.2015, 23:42     Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода? #17
Цитата Сообщение от DrOffset Посмотреть сообщение
Наличие этого "const на конце" как раз делает неявный this
При такой постановке вопроса согласен

Цитата Сообщение от hoggy Посмотреть сообщение
означает, что результат работы функции - это объект const some
Тут тоже согласен
Yandex
Объявления
02.08.2015, 23:42     Могут ли быть указаны квалификаторы типа в качестве возвращаемого значения функции/метода?
Ответ Создать тему
Опции темы

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