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

make_pair - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 5.00
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
30.08.2011, 12:31     make_pair #1
Почему в функцию make_pair аргументы передаются не по ссылке?
http://www.cplusplus.com/reference/s...ity/make_pair/
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2011, 12:31     make_pair
Посмотрите здесь:

STL std::set, std::pair, std::make_pair C++
C++ make_pair
Какой аналог в Qt стловской std::make_pair? C++ Qt

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.08.2011, 12:36     make_pair #2
PointsEqual, И что вам на это ответить? Потому что передаются не по ссылке.
ЛеЖиК)
 Аватар для ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 630
30.08.2011, 12:39     make_pair #3
перепиши функцию и сделй чтоб по ссылке
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
30.08.2011, 12:41  [ТС]     make_pair #4
просто просматривая объявления функций, я не нашел ни одной , где параметры передавались бы по значению. Исключение - make_pair, значит не просто же так?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.08.2011, 12:54     make_pair #5
PointsEqual, По стандарту сигнатура функции :
C++
1
template <class T1, class T2> pair<T1,T2> make_pair(const T1&, const T2&);
Добавлено через 1 минуту
gcc:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  /**
   *  @brief A convenience wrapper for creating a pair from two objects.
   *  @param  x  The first object.
   *  @param  y  The second object.
   *  @return   A newly-constructed pair<> object of the appropriate type.
   *
   *  The standard requires that the objects be passed by reference-to-const,
   *  but LWG issue #181 says they should be passed by const value.  We follow
   *  the LWG by default.
   */
  // _GLIBCXX_RESOLVE_LIB_DEFECTS
  // 181.  make_pair() unintended behavior
#ifndef __GXX_EXPERIMENTAL_CXX0X__
  template<class _T1, class _T2>
    inline pair<_T1, _T2>
    make_pair(_T1 __x, _T2 __y)
    { return pair<_T1, _T2>(__x, __y); }
#else
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
30.08.2011, 12:55     make_pair #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ForEveR Посмотреть сообщение
По стандарту сигнатура функции :
По стандарту С++98, но в стандарте С++03 так, как по ссылке в первом посте.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.08.2011, 12:59     make_pair #7
asics, Понятно. 03 не обзавелся) Спасибо.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
30.08.2011, 13:01  [ТС]     make_pair #8
Цитата Сообщение от asics Посмотреть сообщение
но в стандарте С++03 так, как по ссылке в первом посте.
ага, вот интересно почему?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.08.2011, 13:10     make_pair #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
181. make_pair() unintended behavior

Section: 20.3.5 [pairs] Status: TC1 Submitter: Andrew Koenig Opened: 1999-08-03 Last modified: 2010-10-29

View all other issues in [pairs].

View all issues with TC1 status.

Discussion:

The claim has surfaced in Usenet that expressions such as

make_pair("abc", 3)

are illegal, notwithstanding their use in examples, because template instantiation tries to bind the first template parameter to const char (&)[4], which type is uncopyable.

I doubt anyone intended that behavior...

Proposed resolution:

In 20.3 [utility], paragraph 1 change the following declaration of make_pair():

template <class T1, class T2> pair<T1,T2> make_pair(const T1&, const T2&);

to:

template <class T1, class T2> pair<T1,T2> make_pair(T1, T2);

In 20.3.5 [pairs] paragraph 7 and the line before, change:

template <class T1, class T2>
pair<T1, T2> make_pair(const T1& x, const T2& y);

to:

template <class T1, class T2>
pair<T1, T2> make_pair(T1 x, T2 y);

and add the following footnote to the effects clause:

According to 12.8 [class.copy], an implementation is permitted to not perform a copy of an argument, thus avoiding unnecessary copies.

Rationale:

Two potential fixes were suggested by Matt Austern and Dietmar Kühl, respectively, 1) overloading with array arguments, and 2) use of a reference_traits class with a specialization for arrays. Andy Koenig suggested changing to pass by value. In discussion, it appeared that this was a much smaller change to the standard that the other two suggestions, and any efficiency concerns were more than offset by the advantages of the solution. Two implementors reported that the proposed resolution passed their test suites.
отсюда
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
30.08.2011, 20:49  [ТС]     make_pair #10
то есть, если бы параметром был строковый литерал и передавался по ссылке , то была бы ошибка...
спасибо.
Хотя до меня все равно не дошло почему) ну ладно
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.08.2011, 22:50     make_pair #11
PointsEqual,

first template parameter to const char (&)[4], which type is uncopyable.
Yandex
Объявления
30.08.2011, 22:50     make_pair
Ответ Создать тему
Опции темы

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