"Значение типа const char* нельзя присвоить сущности типа char*" от чего зависит возникновение или невозникновение данной ошибки?

В ряде вопросов на ruSO, например, здесь, а также в вопросах на CyberForum (например, вот), да и в целом на просторах интернета многие люди сталкиваются с проблемой, описанной в заголовке вопроса. Как исправить её, я знаю из тех же вопросов. Почему возникает, тоже в курсе. Вопрос в другом – почему не возникает у меня?

Если подробнее: попытался для решения вопроса по первой ссылке воспроизвести проблему, чтобы проверить своё решение, а потом уже написать его в ответ. И столкнулся с тем, что у меня прекрасно и без каких-либо проблем работает то, что вызывает вопросы у других. Например, такой простой код:

#include <iostream>

int main()
{
    char * x = "Hello";
    std::cout << x << std::endl;

    getchar();
    return 0;
}

компилируется без проблем и, как и ожидалось, выводит "Hello" как на VS 2015, так и на VS 2008.

Ещё раз вопрос: почему у меня не воспроизводится описанная выше проблема и const char * без проблем присваивается char *? Каковы условия возникновения данной ошибки?


Ответы (1 шт):

Автор решения: user7860670

Эта проблема существовала давно. Однако версии Visual Studio до 2013 реализовали нестандартное поведение и разрешали навалидную инициализацию указателя без const квалификатора строковым литералом. Затем они приняли курс на соответствие стандартам и в Visual Studio 2013 появилась возможность включаить конформное поведение посредством аргумента /Zc:strictStrings. А начиная с Visual Studio 2017 появился режим общего соответствия стандартам /permissive-, который теперь используется по-умолчанию при создании новых проектов.

Кроме того, был исправлен еще один случай не конформного поведения - попытка напрямую инициализировать bool строковым литералом bool foo{"foo"}; теперь корректно распознается как ошибка.

→ Ссылка