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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 5.00
PointsEqual
ниначмуроФ
835 / 519 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
#1

make_pair - C++

30.08.2011, 12:31. Просмотров 2300. Ответов 10
Метки нет (Все метки)

Почему в функцию 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 (C++):

make_pair - C++
Уважаемые форумчане, как написать функцию, которая на вход принимает make_pair? Вызывать буду так: func( std::make_pair(2, 3) );

STL std::set, std::pair, std::make_pair - C++
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы. Собственно перейдем к нашим баранам: есть...

Какой аналог в Qt стловской std::make_pair? - C++ Qt
:) я нуб :)

make_pair - C++
Уважаемые форумчане, как написать функцию, которая на вход принимает make_pair? Вызывать буду так: func( std::make_pair(2, 3) );

STL std::set, std::pair, std::make_pair - C++
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы. Собственно перейдем к нашим баранам: есть...

Какой аналог в Qt стловской std::make_pair? - C++ Qt
:) я нуб :)

make_pair - C++
Уважаемые форумчане, как написать функцию, которая на вход принимает make_pair? Вызывать буду так: func( std::make_pair(2, 3) );

STL std::set, std::pair, std::make_pair - C++
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы. Собственно перейдем к нашим баранам: есть...

Какой аналог в Qt стловской std::make_pair? - C++ Qt
:) я нуб :)


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

Или воспользуйтесь поиском по форуму:
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
30.08.2011, 12:36 #2
PointsEqual, И что вам на это ответить? Потому что передаются не по ссылке.
ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 631
30.08.2011, 12:39 #3
перепиши функцию и сделй чтоб по ссылке
PointsEqual
ниначмуроФ
835 / 519 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
30.08.2011, 12:41  [ТС] #4
просто просматривая объявления функций, я не нашел ни одной , где параметры передавались бы по значению. Исключение - make_pair, значит не просто же так?
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
30.08.2011, 12:54 #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
Эксперт С++
2846 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
30.08.2011, 12:55 #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ForEveR Посмотреть сообщение
По стандарту сигнатура функции :
По стандарту С++98, но в стандарте С++03 так, как по ссылке в первом посте.
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
30.08.2011, 12:59 #7
asics, Понятно. 03 не обзавелся) Спасибо.
PointsEqual
ниначмуроФ
835 / 519 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
30.08.2011, 13:01  [ТС] #8
Цитата Сообщение от asics Посмотреть сообщение
но в стандарте С++03 так, как по ссылке в первом посте.
ага, вот интересно почему?
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
30.08.2011, 13:10 #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
ниначмуроФ
835 / 519 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
30.08.2011, 20:49  [ТС] #10
то есть, если бы параметром был строковый литерал и передавался по ссылке , то была бы ошибка...
спасибо.
Хотя до меня все равно не дошло почему) ну ладно
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
30.08.2011, 22:50 #11
PointsEqual,

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru