Это не значит, что std::make_pair
предназначен для использования; вы не должны явно указывать аргументы шаблона.
C ++ 11 std::make_pair
принимает два аргумента типа T&&
и U&&
, где T
и U
являются шаблонами типа. Фактически, он выглядит так (игнорируя возвращаемый тип):
template <typename T, typename U>
[return type] make_pair(T&& argT, U&& argU);
Когда вы вызываете std::make_pair
и явно указываете аргументы типа шаблона, дедукция аргументов не происходит. Вместо этого аргументы типа заменяются непосредственно в объявлении шаблона, давая:
[return type] make_pair(std::string&& argT, int&& argU);
. Обратите внимание, что оба этих типа параметров являются ссылками rvalue. Таким образом, они могут связываться только с rvalues. Это не проблема для второго аргумента, который вы передаете, 7
, потому что это выражение rvalue. s
, однако, является выражением lvalue (оно не является временным и не перемещается). Это означает, что шаблон функции не соответствует вашим аргументам, поэтому вы получаете ошибку.
Итак, почему это работает, когда вы явно не указываете, что T
и U
являются в списке аргументов шаблона? Короче говоря, ссылочные параметры rvalue являются особыми в шаблонах. Отчасти благодаря языковой функции, названной ссылкой, коллапсирующей , ссылочный параметр rvalue типа A&&
, где A
является параметром типа шаблона, может связываться с любым типом A
.
Не имеет значения, является ли A
значением lvalue, rvalue, const-квалифицированным, нестабильным или неквалифицированным, A&&
может привязываться к этому объекту (опять же, если и только если A
сам является параметром шаблона).
В вашем примере мы вызываем вызов:
make_pair(s, 7)
Здесь s
является lзначением типа std::string
и 7
- значение типа int
. Поскольку вы не указываете аргументы шаблона для шаблона функции, выполняется вывод аргумента шаблона, чтобы выяснить, что представляют собой аргументы.
Чтобы связать s
, lvalue, с T&&
, компилятор выводит T
будет std::string&
, давая аргумент типа std::string& &&
. Однако ссылок на ссылки нет, поэтому эта «двойная ссылка» рушится, чтобы стать std::string&
. s
является совпадением.
Проще связывать 7
с U&&
: компилятор может вывести U
как int
, давая параметр типа int&&
, который связывает успешно 7
, потому что это rvalue.
Есть много тонкостей с этими новыми языковыми особенностями, но если вы выполните одно простое правило, это довольно просто:
Если аргумент шаблона можно вывести из аргументов функции, пусть это будет выведено. Не указывайте явно аргумент, если вы абсолютно не обязаны.
Пусть компилятор выполнит тяжелую работу, и в 99,9% случаев это будет именно то, что вы хотели в любом случае. Когда это не то, что вы хотели, вы обычно получаете ошибку компиляции, которую легко идентифицировать и исправить.
blockquote>
Когда работа с CSS наконец управляет Вами безумный обитая войлоком палата, что они вставят Вас, имеет дополнение на внутренний из стен.
Я знаю, что это - ответ на Ваш вопрос, но больше подсказки. Каждый раз, когда я имею дело с полем и дополнением, я добавлю границу вокруг части, Вы работаете с, затем оттуда, это показывает мне комнату, с которой я должен работать. Когда я все установлен, я удаляю границу.
Добавьте границу, даже просто временно. Поскольку Вы играете с числами, Вы будете видеть различие.
На самом деле, временные границы вокруг элементов являются полезным способом работать, такие, что Вы видите, почему плавания отбрасывают, и т.д.
Создайте себя прокомментированная основная таблица стилей, которую можно использовать в качестве шаблона каждый раз, когда необходимо создать новый сайт или отредактировать существующий сайт.
можно добавить к нему, когда Вы растете в знании и применяете его к всевозможным браузерам, чтобы видеть, как различные вещи ведут себя.
Вы также сможете добавить в комментариях или примерах о другом трудно для запоминания материала или материала, который является интуитивным счетчиком.
Мне, "дополняя" просто звучит более внутренним, чем "поле". Возможно, размышление о печатной странице помогло бы? Поля являются областями на далекой внешней стороне - обычно, Вы не можете даже распечатать к краю - они unmarkable. В тех полях содержание могло быть дополнено для обеспечения дополнительного барьера между содержанием и полем?
, После того как Вы работаете в CSS достаточно, это станет второй натурой для запоминания этого.
Я только что изучал это со временем - модель поля довольно проста, но главная причина, людям трудно, состоит в том, потому что body
явно не повреждает модель.
Действительно, если Вы даете body
поле и фон, необходимо видеть окруженный белой полосой. Однако это не имеет место - body
, дополнение совпадает с полем. Это устанавливает несколько неправильных вещей о модели поля.
я обычно думаю об этом как это:
Распечатайте схему от раздел Box Dimensions спецификации и поместите его на стену.
Вы используете поле. При помещении чего-то в поле, Вы вставили бы некоторое дополнение, чтобы удостовериться, что оно не имело привкус против сторон. Поле затем было бы другой вещью.
Тим Сондерс дал отличный совет - когда я только начал работать с CSS, я решил создать хорошую, полностью прокомментированную базовую таблицу стилей. Эта таблица стилей менялась много раз и остается прекрасным ресурсом.
Однако, когда я столкнулся с проблемами моей собственной модели коробки, я начал использовать «Мо Пи». Например: «Я недостаточно толстый, мне нужно съесть мо пи». Странно, но у меня это сработало. Конечно, я набрал двадцать фунтов, изучая CSS ...; -)