Невозможно преобразовать аргумент 1 из 'std :: string' в 'std :: string & amp; & amp;' [Дубликат]

Примечание: связанная проблема Jenkins с тех пор была решена.

Как упоминалось в JENKINS-26133 , невозможно получить вывод оболочки в виде переменной. В качестве обходного пути было предложено использовать чтение-чтение из временного файла. Итак, ваш пример выглядел бы так:

sh "echo foo > result";
def output=readFile('result').trim()
echo "output=$output";

71
задан CinCout 7 April 2016 в 13:12
поделиться

1 ответ

Это не значит, что 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% случаев это будет именно то, что вы хотели в любом случае. Когда это не то, что вы хотели, вы обычно получаете ошибку компиляции, которую легко идентифицировать и исправить.

112
ответ дан James McNellis 19 August 2018 в 13:29
поделиться
  • 1
    Это очень хорошее и полное объяснение. Спасибо! – vmpstr 10 March 2012 в 03:01
  • 2
    @James - это "одно простое правило" из другой статьи или ответа, которую я должен прочитать? – Michael Burr 11 March 2012 в 00:02
  • 3
    @MichaelBurr: Нет, я только что сделал это. :-) Итак, я надеюсь, что это правда! Я думаю, что это правда ... это правило работает для меня почти все время. – James McNellis 11 March 2012 в 00:15
  • 4
    @James: спасибо. «Коробка с цитатами» вокруг меня заставляла меня думать, что это могло быть что-то изначально написанное в другом месте. Этот ответ был действительно информативным, и я просто хотел удостовериться, что я ничего не пропал где-то в другом месте. – Michael Burr 11 March 2012 в 00:30
  • 5
    Это относится и к кортежам? – Ferruccio 25 June 2015 в 15:43
Другие вопросы по тегам:

Похожие вопросы: