c++,文字列配列ベクトルで原因のわからないコンパイルエラー


(参考書:明解c++中級編の426ページ)`char* p[] = { "PAUL", "X", "MAC" };`  
のコメントでここですと示した場所なのですがなぜコンパイルエラーになるのですか？

[重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態  
エラー C2440 '初期化中': 'const char [2]' から 'char *' に変換できません。]  
///////////////////  
[重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態  
エラー (アクティブ) E0144 型 "const char *" の値を使用して型 "char *" のエンティティを初期化することはできません ]

と表示されてまい構文エラーが治せません、そもそも参考書のコードなので間違えてるとはおもえないのと初学者のためデバックに困っています。自分で少し書き換えてみましたがやはりわからないので回答をお願いしたいです。(コピペも試しました。)

[code]

                #include "conio.h"
            #//include <iomanip>
            #include <string>
            #include <iostream>
            #include <vector>
            //#include <algorithm>
            //#include <functional>
            //#include <typeinfo>
            using namespace std;
    
            vector<string> str2dary_to_vec(char* p, int h, int w)
            {
                vector<string> temp;
                for (int i = 0; i < h; i++) {
                    temp.push_back(&p[i * w]);
                }
    
                return temp;
            }
    
            vector<string> strptary_to_vec(char** p, int n)
            {
                vector<string> temp;
                for (int i = 0; i < n; i++)
                {
                    temp.push_back(p[i]);
                }
    
                return temp;
            }
    
    
    
    
            int main()
            {
                //  char* p[]   = {"PAUL", "X", "MAC"}; 
    
                char a[][5] = { "LISP","C","Ada" };
                char* p[] = { "PAUL", "X", "MAC" };//ここです
    
    
                vector<string> sa = str2dary_to_vec(&a[0][0],3,5);
                for (vector<string>::size_type i = 0; i < sa.size(); i++) {
                    cout << "sa[" << i << "] " << sa[i] << "\n";
                }
    
                vector<string> sp = strptary_to_vec(p, 3);
                for (vector<string>::size_type i = 0; i < sp.size(); i++) {
                    cout << "sa[" << i << "] " << sp[i] << "\n";
    
                }
    
    
    
    
                _getch();
                return 0;
            }
    
[/code]




> 参考書のコードなので間違えてるとはおもえない

「明解c++中級編」はC++標準を完全に無視した悪質な書籍と言えます。初学者は読むべきではありません。

エラーの通りC++言語では'const char [2]' から 'char *' へは変換できません。Visual
C++では拡張機能により変換が許可されていましたが、Visual Studio
2013で導入された[`/Zc:strictStrings`オプション](https://docs.microsoft.com/en-
us/cpp/build/reference/zc-strictstrings-disable-string-literal-type-
conversion?view=vs-2017)によりこの機能を無効化できます。更にVisual Studio
2017で導入された`/permissive-`オプションでC++標準準拠に指定すると`/Zc:strictStrings`も連動して有効になります。

初学者を自称するのであれば、標準に準拠した書籍を読むか、書籍が指定する環境を用意するか、どちらかの対応をとるべきです。




> 参考書のコードなので間違えてるとはおもえない

「明解c++中級編」はC++標準を完全に無視した悪質な書籍と言えます。初学者は読むべきではありません。

エラーの通りC++言語では'const char [2]' から 'char *' へは変換できません。Visual
C++では拡張機能により変換が許可されていましたが、Visual Studio
2013で導入された[`/Zc:strictStrings`オプション](https://docs.microsoft.com/en-
us/cpp/build/reference/zc-strictstrings-disable-string-literal-type-
conversion?view=vs-2017)によりこの機能を無効化できます。更にVisual Studio
2017で導入された`/permissive-`オプションでC++標準準拠に指定すると`/Zc:strictStrings`も連動して有効になります。

初学者を自称するのであれば、標準に準拠した書籍を読むか、書籍が指定する環境を用意するか、どちらかの対応をとるべきです。

