Корректен ли такой код и почему?
От: Аноним  
Дата: 04.10.05 09:25
Оценка:
struct A
{
    GetStr() const { return str1 + str2; }
    std::string str1;
    std::string str2;
};

int main()
{
    cout << GetStr().c_str() << endl;
    return 0;
}
Re: Корректен ли такой код и почему?
От: MaximE Великобритания  
Дата: 04.10.05 09:27
Оценка:
wrote:

>
> struct A
> {
>     GetStr() const { return str1 + str2; }
>     std::string str1;
>     std::string str2;
> };
>
> int main()
> {
>     cout << GetStr().c_str() << endl;
>     return 0;
> }
>


Некорректен. У функции отсутствует возращаемое значение.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re: Корректен ли такой код и почему?
От: Анатолий Широков СССР  
Дата: 04.10.05 09:29
Оценка:
Имеется ввиду:

struct A
{
    std::string GetStr() const { return str1 + str2; }
    std::string str1;
    std::string str2;
};

int main()
{
    cout << A().GetStr().c_str() << endl;
    return 0;
}


Да, коррекнен.
Re: Корректен ли такой код и почему?
От: ssm Россия  
Дата: 04.10.05 09:30
Оценка:
Здравствуйте, Аноним, Вы писали:



Нет этот код некорректен, чтобы он был корректен необходимо
1. подключить следующие заголовки: iostream, string
2. заменить cout на std::cout
Re: Корректен ли такой код и почему?
От: Глеб Алексеев  
Дата: 04.10.05 09:31
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>
А>struct A
А>{
А>    GetStr() const { return str1 + str2; }
А>    std::string str1;
А>    std::string str2;
А>};

А>int main()
А>{
А>    cout << GetStr().c_str() << endl;
А>    return 0;
А>}
А>

Некорректен, у функции GetStr не указан тип возвращаемого значения (синтаксическая ошибка), в main вызывается необъявленная функция GetStr() в глобальном пространстве имен. Если поправить на
std::string GetStr()const
...
A a;
cout << a.GetStr(); // .c_str() - лишнее

, то будет корректен, если на
const std::string& GetStr()const

, то нет.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Корректен ли такой код и почему?
От: Bell Россия  
Дата: 04.10.05 09:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>struct A
А>{
А>    GetStr() const { return str1 + str2; }
А>    std::string str1;
А>    std::string str2;
А>};

А>int main()
А>{
А>    cout << GetStr().c_str() << endl;
А>    return 0;
А>}
А>


Во-первых, у A::GetStr отсутствует возвращаемое значение, а сишное правило "int по-умолчанию" в С++ не действует.
Во-вторых, не наблюдается "обычной" функции GetStr, к которой обращается main.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Корректен ли такой код и почему?
От: Аноним  
Дата: 04.10.05 09:35
Оценка:
Прошу прошения за неаккуратность, имелось в виду

А>>
А>>struct A
А>>{
А>>    std::string GetStr() const { return str1 + str2; }
А>>    std::string str1;
А>>    std::string str2;
А>>};

А>>int main()
А>>{
А>>    cout << A().GetStr().c_str() << endl;
А>>    return 0;
А>>}
А>>


c_str — не лишнее, мне как раз нужно понять, почему в данном случае можно так запросто обращаться к функции-члену временного объекта.
Re: Корректен ли такой код и почему?
От: Шебеко Евгений  
Дата: 04.10.05 09:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>struct A
А>{
А>    GetStr() const { return str1 + str2; }
А>    std::string str1;
А>    std::string str2;
А>};

А>int main()
А>{
А>    cout << GetStr().c_str() << endl;
А>    return 0;
А>}
А>


Некоректен.
GetStr() const подразумивается int GetStr() const

И как тут правильно сказали
    cout << A().GetStr().c_str() << endl;
Re[3]: Корректен ли такой код и почему?
От: srggal Украина  
Дата: 04.10.05 09:38
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Прошу прошения за неаккуратность, имелось в виду


А>>>
А>>>struct A
А>>>{
А>>>    std::string GetStr() const { return str1 + str2; }
А>>>    std::string str1;
А>>>    std::string str2;
А>>>};

А>>>int main()
А>>>{
А>>>    cout << A().GetStr().c_str() << endl;
А>>>    return 0;
А>>>}
А>>>


А>c_str — не лишнее, мне как раз нужно понять, почему в данном случае можно так запросто обращаться к функции-члену временного объекта.


А почему бы и нет: синтаксис позволяет, семантика тоже ( время жизни объекта )

Т.е. при вызове функций-членов в приведенном Вами коде — объект, хоть и временный, но живой, и вполне работоспособный
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[3]: Корректен ли такой код и почему?
От: Глеб Алексеев  
Дата: 04.10.05 09:39
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>c_str — не лишнее, мне как раз нужно понять, почему в данном случае можно так запросто обращаться к функции-члену временного объекта.

Потому что временный объект живет до окончания вычисления всего выражения, и функция-член — константная.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Корректен ли такой код и почему?
От: Bell Россия  
Дата: 04.10.05 09:40
Оценка:
Здравствуйте, Аноним, Вы писали:


А>c_str — не лишнее, мне как раз нужно понять, почему в данном случае можно так запросто обращаться к функции-члену временного объекта.


Потому что время жизни временного объекта это позволяет.

ЗЫ
Временный объект в данном случае разрушается после вычисления всего выражения.
Любите книгу — источник знаний (с) М.Горький
Re[3]: Корректен ли такой код и почему?
От: Анатолий Широков СССР  
Дата: 04.10.05 09:41
Оценка:
А>c_str — не лишнее, мне как раз нужно понять, почему в данном случае можно так запросто обращаться к функции-члену временного объекта.

Стандарт разрешает для временного объекта вызывать как константные так и не константные функции-члены — см 3.10 п.2 и 47 сноска.
Re[4]: Корректен ли такой код и почему?
От: Bell Россия  
Дата: 04.10.05 09:42
Оценка: 1 (1)
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Здравствуйте, <Аноним>, Вы писали:


А>>c_str — не лишнее, мне как раз нужно понять, почему в данном случае можно так запросто обращаться к функции-члену временного объекта.

ГА>Потому что временный объект живет до окончания вычисления всего выражения, и функция-член — константная.

Второе условие вовсе не является обязательным.
Любите книгу — источник знаний (с) М.Горький
Re[4]: Корректен ли такой код и почему?
От: Анатолий Широков СССР  
Дата: 04.10.05 09:43
Оценка: 1 (1)
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Здравствуйте, <Аноним>, Вы писали:


А>>c_str — не лишнее, мне как раз нужно понять, почему в данном случае можно так запросто обращаться к функции-члену временного объекта.

ГА>Потому что временный объект живет до окончания вычисления всего выражения, и функция-член — константная.

Вызывать можно и не констанстную функцию-член.
Re[4]: Корректен ли такой код и почему?
От: Аноним  
Дата: 04.10.05 09:45
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Аноним, Вы писали:



А>>c_str — не лишнее, мне как раз нужно понять, почему в данном случае можно так запросто обращаться к функции-члену временного объекта.


B>Потому что время жизни временного объекта это позволяет.


B>ЗЫ

B>Временный объект в данном случае разрушается после вычисления всего выражения.

А в таком случае?
void f(const char*) {}
int main()
{
    f(A().GetStr().c_str());
}
Re[2]: Корректен ли такой код и почему?
От: Bell Россия  
Дата: 04.10.05 09:45
Оценка: 1 (1)
Здравствуйте, Шебеко Евгений, Вы писали:

ШЕ>
ШЕ>GetStr() const подразумивается int GetStr() const
ШЕ>


Хотя некоторые компиляторы и поддерживают это правило, тем не менее это противоречит стандарту:
здесь
Автор: Bell
Дата: 18.08.05
Любите книгу — источник знаний (с) М.Горький
Re[5]: Корректен ли такой код и почему?
От: Анатолий Широков СССР  
Дата: 04.10.05 09:46
Оценка:
А>А в таком случае?
А>
А>void f(const char*) {}
А>int main()
А>{
А>    f(A().GetStr().c_str());
А>}
А>


Временные объекты будут жить до окончания полного выражения, то есть до ';'
Re[5]: Корректен ли такой код и почему?
От: Bell Россия  
Дата: 04.10.05 09:48
Оценка:
Здравствуйте, Аноним, Вы писали:

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


B>>Здравствуйте, Аноним, Вы писали:



А>>>c_str — не лишнее, мне как раз нужно понять, почему в данном случае можно так запросто обращаться к функции-члену временного объекта.


B>>Потому что время жизни временного объекта это позволяет.


B>>ЗЫ

B>>Временный объект в данном случае разрушается после вычисления всего выражения.

А>А в таком случае?

А>
А>void f(const char*) {}
А>int main()
А>{
А>    f(A().GetStr().c_str());
А>}
А>


Код корректен. ВО разрушится после вызова f.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Корректен ли такой код и почему?
От: Phoenickx  
Дата: 05.10.05 12:24
Оценка:
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Некорректен, у функции GetStr не указан тип возвращаемого значения (синтаксическая ошибка)


А разве в таком случае не будет принят int по умолчанию?
Re[3]: Корректен ли такой код и почему?
От: Bell Россия  
Дата: 05.10.05 12:27
Оценка:
Здравствуйте, Phoenickx, Вы писали:

Смотри чуть ниже
Автор: Bell
Дата: 04.10.05

Любите книгу — источник знаний (с) М.Горький
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.