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

Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 5.00
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
08.09.2013, 14:08     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит #1
Друзья! Вот корректный код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class foo
{
public:
                foo()
                    { 
                    }
                foo(int x)
                    { 
                    }
                ~foo(){}
};
 
 
//+++++++++++++++++++++++++++++++++++++
 
int main()
{
    foo c2 = foo (9);
}
А вот некорректный:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class foo
{
public:
                foo()
                    { 
                    }
                foo(int x)
                    { 
                    }
                foo(foo& f)
                    { 
                    }
                ~foo(){}
};
 
 
//+++++++++++++++++++++++++++++++++++++
 
int main()
{
    foo c2 = foo (9);
}
Ошибки,

Bash
1
2
3
4
5
6
7
8
9
10
main_p.cpp: In function 'int main()':
main_p.cpp:21:20: error: no matching function for call to 'foo::foo(foo)'
main_p.cpp:21:20: note: candidates are:
main_p.cpp:10:17: note: foo::foo(foo&)
main_p.cpp:10:17: note:   no known conversion for argument 1 from 'foo' to 'foo&'
main_p.cpp:7:17: note: foo::foo(int)
main_p.cpp:7:17: note:   no known conversion for argument 1 from 'foo' to 'int'
main_p.cpp:4:17: note: foo::foo()
main_p.cpp:4:17: note:   candidate expects 0 arguments, 1 provided
Выполнение завершено
первая же из которых вводит в ступор. У меня нет вызова foo::foo(foo)! Если бы он был, то первый код не скомпилился бы. В общем, непонятно, почему foo(foo& f) всё портит во втором коде, хотелось бы разъяснений, тык скыть. Спасибо, кто откликнется.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2013, 14:08     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит
Посмотрите здесь:

сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь усложнять? C++
C++ Конструктор принимающий два целочисленных значения
Функция в качестве аргумента C++
Передача двухмерного массива в качестве аргумента C++
C++ Создать функцию, которая принимает в качестве аргумента ссылку на string, и преобразует все буквы в верхний регистр
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
11.09.2013, 17:38     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит #41
В С++11 появилось несколько вариантов rvalue, вот тут можно почитать: rvalue ссылки.
Цитата Сообщение от Somebody Посмотреть сообщение
Но какими образом из этого следует, что он сам константный?
Из контекста:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
struct s {};
 
const char* f(const s&&)
{
    return "const";
}
 
const char* f(s&&)
{
    return "non-const";
}
 
const s g() {return s();}
 
int main()
{
   std::cout << f(g()) << std::endl;
   std::cout << f(s()) << std::endl;
 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
11.09.2013, 18:04     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит #42
Так вот и я про то же, что константность следует из контекста, а никак не
Цитата Сообщение от Croessmah Посмотреть сообщение
Цитата Сообщение от kravam Посмотреть сообщение
и опять- почему константны, да ещё и как бы?
потому что они временные
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
11.09.2013, 21:26  [ТС]     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит #43
Ну, в общем, я многое понял, но необходимо, конечно закреплять материал. Пока же вопрос у меня такой, вроде один остался- почему временные объекты константны? То есть по логике вещей таки должно быть. А по стандарту? Наверное, ответ должен быть в стандарте где-то, если быть точным в параграфе 12.2 "Temporary objects", но я его там не нашёл.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.09.2013, 22:05     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит #44
http://herbsutter.com/2008/01/01/got...portant-const/
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
12.09.2013, 20:57  [ТС]     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит #45
Что касается моего вопроса, то по ссылке есть такое предложение

"The "const" is important. The first line is an error and the code won’t compile portably with this reference to non-const, because f() returns a temporary object (i.e., rvalue) and only lvalues can be bound to references to non-const. "

Но где ж тут написано, что временнный объект должен быть константным? Ну да, написано что "const" важна. Но я хоте бы прочесть: "f() возвращает временный объект, который константный". Как-то так.

Добавлено через 22 часа 19 минут
а, ребята?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.09.2013, 21:18     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит #46
временный объект не является константным, но забиндить его можно только к ссылке на константу
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
12.09.2013, 21:39  [ТС]     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит #47
Как понять "забиндить"?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2013, 22:34     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит
Еще ссылки по теме:

Использование массивов в качестве аргумента функции C++
Передача символьного массива в качестве аргумента C++
C++ Конструктор, принимающий параметр

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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.09.2013, 22:34     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит #48
Цитата Сообщение от kravam Посмотреть сообщение
Как понять "забиндить"?
привязать
Yandex
Объявления
12.09.2013, 22:34     Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит
Ответ Создать тему
Опции темы

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