Вызов cmake из пакетного скрипта (внутри докера)

Основная причина этой (стандартно-согласованной) двусмысленности, по-видимому, лежит в стоимости преобразования: разрешение перегрузки пытается минимизировать операции, выполняемые для преобразования аргумента в соответствующий параметр. Массив эффективно указатель на свой первый элемент, хотя и украшен некоторой информацией типа времени компиляции. Преобразование от массива к указателю не стоит больше, чем, например, сохраняя адрес самого массива или инициализируя ссылку на него. С этой точки зрения двусмысленность кажется оправданной, хотя концептуально она неинтуитивная (и может быть подпара). Фактически, эта аргументация применяется ко всем преобразованиям Lvalue, как это предлагается в приведенной ниже цитате. Другой пример:

void g() {}

void f(void(*)()) {}
void f(void(&)()) {}

int main() {
    f(g); // Ambiguous
}

Следующее обязательное стандартное. Функции, которые не являются специализациями какого-либо шаблона функции, предпочтительнее, чем те, которые являются, если обе они одинаково хорошо соответствуют (см. [Over.match.best] / (1.3), (1.6)). В нашем случае преобразование выполняется преобразованием между массивами и указателями, которое является преобразованием Lvalue с рангом Точного соответствия (согласно таблице 12 в [over.ics.user]). [over.ics.rank] / 3:

  • Стандартная последовательность преобразования S1 является лучшей последовательностью преобразования, чем стандартная последовательность преобразования S2, если S1 является правильной подпоследовательностью S2 (сравнение последовательностей преобразования в канонической форме, определенных в 13.3.3.1.1, за исключением любого преобразования Lvalue, последовательность преобразования идентичности рассматривается как подпоследовательность любой последовательности, не являющейся идентификационной конверсией), или, если не это, ранг S1 лучше ранга S2 или S1 и S2 имеют один и тот же ранг и различимы по правилам в параграфе ниже, или, если не это, [..]
blockquote>

Первая маркерная точка исключает наше преобразование (поскольку это преобразование Lvalue). Второй требует разницы в рангах, которых нет, так как оба преобразования имеют Точный рейтинг соответствия; «Правила в нижеследующем абзаце», т. Е. В [over.ics.rank] / 4, также не охватывают преобразования между массивами и указателями. Итак, верьте или нет, ни одна из обеих последовательностей преобразования не лучше, чем другая, и, следовательно, выбрано char const* -overload.


Возможное обходное решение: Определите вторую перегрузку как шаблон функции как ну, тогда частичное упорядочение срабатывает и выбирает первый.

template 
auto foo(T s)
  -> std::enable_if_t{}>
{
    std::cout << "raw, size=" << std::strlen(s) << std::endl;
}

Демо .

0
задан sav 16 January 2019 в 09:34
поделиться

1 ответ

Если вы хотите, чтобы скрипт выполнялся, когда ваш контейнер работает (не собирается), вы должны поместить его в директивы ENTRYPOINT или CMD. Но если у вас есть конвейер, лучше поместить все это в один файл bat и вызвать этот файл из Dockerfile

1111]

FROM foo
WORKDIR d:/work
# copy bat file into container
COPY entrypoint.bat d:/work/entrypoint.bat 
ENTRYPOINT ["d:/work/entrypoint.bat"]

Таким образом, после построения изображения просто запустите его без аргументов

docker build -t my-image .
docker run my-image   # ENTRYPOINT gets executed here
0
ответ дан sav 16 January 2019 в 09:34
поделиться
Другие вопросы по тегам:

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