Casting & ldquo; указатель на указатель на объект & rdquo; to & ldquo; указатель на указатель на постоянный объект & rdquo; [Дубликат]

Пакет Visual Studio NuGet необходимо обновить для новой версии набора инструментов

У меня просто возникла проблема с подключением libpng с Visual Studio 2013. Проблема в том, что в файле пакета были только библиотеки для Visual Studio 2010 и 2012.

Правильное решение - надеяться, что разработчик выпустит обновленный пакет и затем обновит его, но он работал для меня, взломав дополнительную настройку для VS2013, указав на файлы библиотеки VS2012.

Я отредактировал пакет (в папке packages внутри каталога решения), найдя packagename\build\native\packagename.targets и внутри этого файла, скопировав все секции v110. Я изменил v110 на v120 в полях условий только очень осторожно, чтобы пути с именами файлов были все как v110. Это просто позволило Visual Studio 2013 подключиться к библиотекам на 2012 год, и в этом случае он работал.

15
задан abyss.7 4 December 2013 в 09:41
поделиться

2 ответа

Язык позволяет неявное преобразование из double ** в const double *const *, но не к const double **. Преобразование, которое вы пытаетесь, будет неявно нарушать правила корректности const, даже если это не сразу очевидно.

Пример в стандарте [de facto standard] C ++ иллюстрирует проблему

https://isocpp.org/wiki/faq/const-correctness#constptrptr-conversion

В принципе, правило: после добавления const на некотором уровне косвенности , вы должны добавить const ко всем уровням косвенности до упора вправо. Например, int ***** не может быть неявно преобразован в int **const ***, но он может быть неявно преобразован в int **const *const *const *

12
ответ дан JSQuareD 25 August 2018 в 01:22
поделиться

Правильно, что double ** не может быть неявно преобразован в const double **. Однако он может быть преобразован в const double * const *.

Представьте себе этот сценарий:

const double cd = 7.0;
double d = 4.0;
double *pd = &d;
double **ppd = &pd;
const double **ppCd = ppd;  //this is illegal, but if it were possible:
*ppCd = &cd;  //now *ppCd, which is also *ppd, which is pd, points to cd
*pd = 3.14; // pd now points to cd and thus modifies a const value!

Итак, если ваша функция не намерена изменять какой-либо из указателей, измените это взять const double * const *. Если он намеревается внести изменения, вы должны решить, являются ли все его модификации безопасными, и, таким образом, const_cast можно использовать, или вам действительно нужно пройти в const double **.

9
ответ дан Angew 25 August 2018 в 01:22
поделиться
Другие вопросы по тегам:

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