Visual C++ 2003 ~ 2015 の新機能Visual C++ What's New 2003 through 2015

このページは、Visual Studio 2003 から 2015 までのすべてのバージョンの Visual C++ の "新機能" をまとめたものです。This page gathers all the "What's New" pages for all versions of Visual C++ from Visual Studio 2015 back to 2003. この情報は、以前のバージョンの Visual Studio からアップグレードする場合に有用な情報として提供されます。This information is provided as a convenience in case it might be useful when upgrading from earlier versions of Visual Studio.

注意

現行版の Visual Studio の詳細については、「What's new for Visual C++ in Visual Studio」(Visual Studio の Visual C++ の新機能)、「Conformance Improvements in Visual C++ in Visual Studio」(Visual Studio の C++ 準拠の強化) を参照してください。For information about the current version of Visual Studio, see What's new for Visual C++ in Visual Studio and Conformance Improvements in Visual C++ in Visual Studio.

Visual Studio 2015 の C++ の新機能What's New for C++ in Visual Studio 2015

Visual Studio 2015 以降では、コンパイラの準拠に関する継続的な強化によって、コンパイラが既存のソース コードを認識する方法が変わる可能性があります。In Visual Studio 2015 and later, ongoing improvements to compiler conformance can sometimes change how the compiler understands your existing source code. このような場合、以前にビルドして問題なく実行できていたコードでも、ビルド時に新しいエラーや異なるエラーが発生したり、動作が変わったりする可能性があります。When this happens, you might encounter new or different errors during your build, or even behavioral differences in code that previously built and seemed to run correctly.

幸いなことに、これらの変更はほとんどのソース コードにほとんど、またはまったく影響がありません。また、変更に対応するためにソース コードやその他の変更が必要な場合でも、通常は軽微で簡単な変更で済みます。Fortunately, these differences have little or no impact on most of your source code and when source code or other changes are needed to address these differences, fixes are usually small and straight-forward. 以前は問題がなかったソース コードで、変更が必要な (修正前の) コード例と、正しい (修正後の) コード例を多数紹介します。We've included many examples of previously-acceptable source code that might need to be changed (before) and the fixes to correct them (after).

これらの変更点はソース コードや他のビルド成果物に影響はあっても、Visual C++ の異なるバージョン間のバイナリの互換性には影響がありません。Although these differences can affect your source code or other build artifacts, they don't affect binary compatibility between updates to Visual C++ versions. より重大な変更で、互換性に影響する変更の場合、バイナリの互換性に影響が及ぶ可能性がありますが、このようなバイナリの互換性に影響する変更は、Visual C++ のメジャーバージョンが異なる場合にのみ発生します。A more-severe kind of change, the breaking change can affect binary compatibility, but these kinds of binary compatibility breaks only occur between major versions of Visual C++. たとえば、Visual C++ 2013 と Visual C++ 2015 間などです。For example, between Visual C++ 2013 and Visual C++ 2015. Visual C++ 2013 と Visual C++ 2015 の間の互換性に影響する変更点については、「Visual C++ 2003 ~ 2015 の変更履歴」を参照してください。For information on the breaking changes that occurred between Visual C++ 2013 and Visual C++ 2015, see Visual C++ change history 2003 - 2015.

Visual Studio 2015 での準拠の強化Conformance Improvements in Visual Studio 2015

  • /Zc:forScope- オプション/Zc:forScope- option

    コンパイラ オプション /Zc:forScope- は非推奨となりました。今後のリリースからは削除されます。The compiler option /Zc:forScope- is deprecated and will be removed in a future release.

      Command line warning  D9035: option 'Zc:forScope-' has been deprecated and will be removed in a future release
    

    このオプションは通常、標準ではスコープから外れるポイントの後のループ変数を使用する、非標準のコードを許可するために使用されていました。The option was usually used in order to allow nonstandard code that uses loop variables after the point where, according to the standard, they should have gone out of scope. これは /Za オプションを使ってコンパイルするときにのみ必要でした。/Za がない場合は、ループの後でも常に for ループ変数が使用できるからです。It was only necessary when you are compiling with the /Za option, since without /Za, using a for loop variable after the end of the loop is always allowed. 標準への準拠を考慮しない場合 (たとえば、コードを他のコンパイラに移植しない場合)、/Za オプションをオフにする (または、[言語拡張機能の無効化] プロパティを [いいえ] に設定する) こともできます。If you don't care about standards conformance (for example, if your code isn't meant to portable to other compilers), you could turn off the /Za option (or set the Disable Language Extensions property to No). 移植可能で標準に準拠したコードの記述を考慮する場合、標準に準拠するようコードを再記述する必要があります。そのためには、変数の宣言をループの外側に移動します。If you do care about writing portable, standards-compliant code, you should rewrite your code so that it conforms to the standard by moving the declaration of such variables to a point outside the loop.

      // zc_forScope.cpp
      // compile with: /Zc:forScope- /Za
      // C2065 expected
      int main() {
         // Uncomment the following line to resolve.
         // int i;
         for (int i =0; i < 1; i++)
            ;
         i = 20;   // i has already gone out of scope under /Za
      }
    
  • Zg コンパイラオプション。Zg compiler option.

    /Zg コンパイラ オプション (関数プロトタイプの生成) は使用できなくなりました。The /Zg compiler option (Generate Function Prototypes) is no longer available. 前バージョンで、このコンパイラ オプションは非推奨とされました。This compiler option was previously deprecated.

  • mstest.exe のコマンド ラインから C++/CLI で単体テストを実行できなくなりました。You can no longer run unit tests with C++/CLI from the command-line with mstest.exe. 代わりに、vstest.console.exe を使いますInstead, use vstest.console.exe

  • mutable キーワード。mutable keyword.

    mutable ストレージクラス指定子は、以前にエラーなしでコンパイルされた場所では使用できなくなりました。The mutable storage class specifier is no longer allowed in places where previously it compiled without error. 現在、コンパイラによってエラー C2071 (無効なストレージ クラス) が出されます。Now, the compiler gives error C2071 (illegal storage class). 標準では、変更可能な指定子はクラスのデータ メンバーの名前にのみ適用でき、const または static として宣言された名前には適用できません。また、参照メンバーにも適用できません。According to the standard, the mutable specifier can be applied only to names of class data members, and cannot be applied to names declared const or static, and cannot be applied to reference members.

    次に例を示します。For example, consider the following code:

      struct S {
          mutable int &r;
      };
    

    以前のバージョンの Microsoft C++ コンパイラはこれを受け入れていましたが、現在のコンパイラでは次のエラーが示されます。Previous versions of the Microsoft C++ compiler accepted this, but now the compiler gives the following error:

      error C2071: 'S::r': illegal storage class
    

    エラーを修正するには、余分なキーワードを削除するだけです mutableTo fix the error, simply remove the redundant mutable keyword.

  • char_16_t と char32_tchar_16_t and char32_t

    char16_t またはを char32_t typedef の別名として使用できなくなりました。これらの型は現在、組み込みとして扱われるためです。You can no longer use char16_t or char32_t as aliases in a typedef, because these types are now treated as built-in. ユーザーとライブラリの作成者が、 char16_t char32_t それぞれおよびのエイリアスとしてとを定義するのは一般的でした uint16_t uint32_tIt was common for users and library authors to define char16_t and char32_t as aliases of uint16_t and uint32_t, respectively.

      #include <cstdint>
    
      typedef uint16_t char16_t; //C2628
      typedef uint32_t char32_t; //C2628
    
      int main(int argc, char* argv[])
      {
      uint16_t x = 1; uint32_t y = 2;
      char16_t a = x;
      char32_t b = y;
      return 0;
      }
    

    コードを更新するには、 typedef 宣言を削除し、これらの名前と競合するその他の識別子の名前を変更します。To update your code, remove the typedef declarations and rename any other identifiers that collide with these names.

  • 非型テンプレート パラメーターNon-type template parameters

    非型テンプレート パラメーターを含む特定のコードは現在、明示的なテンプレート引数を指定すると、型の互換性について正しくチェックされます。Certain code that involves non-type template parameters is now correctly checked for type compatibility when you provide explicit template arguments. たとえば、次のコードは、以前のバージョンの Visual C++ でエラーなしでコンパイルしたものです。For example, the following code compiled without error in previous versions of Visual C++.

      struct S1
      {
          void f(int);
          void f(int, int);
      };
    
      struct S2
      {
          template <class C, void (C::*Function)(int) const> void f() {}
      };
    
      void f()
      {
          S2 s2;
          s2.f<S1, &S1::f>();
      }
    

    現在のコンパイラは、正しくエラーを出します。テンプレート パラメーターの型がテンプレートの引数と一致しないからです (パラメーターは const メンバーへのポインターですが、関数 f は非 const です)。The current compiler correctly gives an error, because the template parameter type doesn't match the template argument (the parameter is a pointer to a const member, but the function f is non-const):

      error C2893: Failed to specialize function template 'void S2::f(void)'note: With the following template arguments:note: 'C=S1'note: 'Function=S1::f'
    

    コードのこのエラーに対処するには、使用するテンプレート引数の型が、テンプレート パラメーターの宣言された型と一致することを確認してください。To address this error in your code, make sure that the type of the template argument you use matches the declared type of the template parameter.

  • __declspec(align)

    コンパイラは関数で __declspec(align) を受け入れなくなりました。The compiler no longer accepts __declspec(align) on functions. これは常に無視されていましたが、コンパイラ エラーを生成するようになりました。This was always ignored, but now it produces a compiler error.

      error C3323: 'alignas' and '__declspec(align)' are not allowed on function declarations
    

    この問題を修正するには、関数の宣言から __declspec(align) を削除してください。To fix this problem, remove __declspec(align) from the function declaration. これは影響がなかったため、削除しても何も変わりません。Since it had no effect, removing it does not change anything.

  • 例外処理Exception handling

    例外処理への変更がいくつかあります。There are a couple of changes to exception handling. まず、例外オブジェクトはコピー可能または移動可能にする必要があります。First, exception objects have to be either copyable or movable. 次のコードは、Visual Studio 2013 ではコンパイルされますが、Visual Studio 2015 ではコンパイルされません。The following code compiled in Visual Studio 2013, but does not compile in Visual Studio 2015:

      struct S {
      public:
          S();
      private:
          S(const S &);
      };
    
      int main()
      {
          throw S(); // error
      }
    

    問題は、コピー コンストラクターはプライベートであるために通常の例外処理とは異なりオブジェクトをコピーできないことです。The problem is that the copy constructor is private, so the object cannot be copied as happens in the normal course of handling an exception. コピーコンストラクターが宣言されている場合も同じことが当てはまり explicit ます。The same applies when the copy constructor is declared explicit.

      struct S {
          S();
          explicit S(const S &);
      };
    
      int main()
      {
          throw S(); // error
      }
    

    コードを更新するには、例外オブジェクトのコピーコンストラクターがパブリックであり、マークされていないことを確認し explicit ます。To update your code, make sure that the copy constructor for your exception object is public and not marked explicit.

    値によって例外をキャッチする場合も、例外オブジェクトをコピー可能にする必要があります。Catching an exception by value also requires the exception object to be copyable. 次のコードは、Visual Studio 2013 ではコンパイルされますが、Visual Studio 2015 ではコンパイルされません。The following code compiled in Visual Studio 2013, but does not compile in Visual Studio 2015:

      struct B {
      public:
          B();
      private:
          B(const B &);
      };
    
      struct D : public B {
      };
    
      int main()
      {
          try
          {
          }
          catch (D d) // error
          {
          }
      }
    

    この問題を解決するには、のパラメーターの型 catch を参照に変更します。You can fix this issue by changing the parameter type for the catch to a reference.

      catch(D& d)
      {
      }
    
  • マクロに続く文字列リテラルString literals followed by macros

    このバージョンでは、コンパイラはユーザー定義リテラルをサポートするようになりました。The compiler now supports user defined literals. その結果、空白文字の介入がないマクロに続く文字列リテラルはユーザー定義のリテラルとして解釈されます。これにより、エラーまたは予期しない結果が起こる可能性があります。As a consequence, string literals followed by macros without any intervening whitespace are interpreted as user-defined literals, which might produce errors or unexpected results. たとえば、以前のコンパイラでは次のコードが正常にコンパイルされていました。For example, in previous compilers the following code compiled successfully:

      #define _x "there"
      char* func() {
          return "hello"_x;
      }
      int main()
      {
          char * p = func();
          return 0;
      }
    

    コンパイラはこれを、マクロに続く "hello" というリテラル文字列として解釈していました。これは "there" に拡張され、2 つの文字列リテラルが 1 つに連結されていました。The compiler interpreted this as a string literal "hello" followed by a macro, which is expanded "there", and then the two string literals were concatenated into one. Visual Studio 2015 では、コンパイラはこれをユーザー定義リテラルと解釈しますが、一致するユーザー定義リテラル _x が定義されていないため、エラーになります。In Visual Studio 2015, the compiler interprets this as a user-defined literal, but since there is no matching user-defined literal _x defined, it gives an error.

      error C3688: invalid literal suffix '_x'; literal operator or literal operator template 'operator ""_x' not found
      note: Did you forget a space between the string literal and the prefix of the following string literal?
    
    

    この問題を解決するには、文字列リテラルとマクロの間に空白に追加します。To fix this problem, add a space between the string literal and the macro.

  • 隣接する文字列リテラルAdjacent string literals

    以前と同様、文字列の解析に関連する変更のため、空白なしの隣接する文字列リテラル (ワイド文字列リテラルまたはナロー文字列リテラルのいずれか) は、以前のバージョンの Visual C++ では、単一の連結文字列と解釈されていました。Similarly to the previous, due to related changes in string parsing, adjacent string literals (either wide or narrow character string literals) without any whitespace were interpreted as a single concatenated string in previous releases of Visaul C++. Visual Studio 2015 では、2 つの文字列間に空白を追加する必要があります。In Visual Studio 2015, you must now add whitespace between the two strings. たとえば、次のコードを変更する必要があります。For example, the following code must be changed:

      char * str = "abc""def";
    

    単に 2 つの文字列間に空白を追加します。Simply add a space in between the two strings.

      char * str = "abc" "def";
    
  • placement new と deletePlacement new and delete

    delete C++ 14 標準に準拠するために、演算子が変更されました。A change has been made to the delete operator in order to bring it into conformance with C++14 standard. 標準の変更について詳しくは、「 C++ サイズの割り当て解除」をご覧ください。Details of the standards change can be found at C++ Sized Deallocation. 変更により、サイズパラメーターを受け取るグローバル演算子のフォームが追加され delete ます。The changes add a form of the global delete operator that takes a size parameter. 互換性に影響する変更点として、以前に delete 同じシグネチャを持つ演算子を ( placement new 演算子に対応するために) 使用していた場合、コンパイラエラー (C2956 は、 配置 new が使用されている位置で発生します。これは、コンパイラが適切な一致演算子を識別しようとするコード内の位置であるためです delete )The breaking change is that if you were previously using an operator delete with the same signature (to correspond with a placement new operator), you will receive a compiler error (C2956, which occurs at the point where the placement new is used, since that's the position in code where the compiler tries to identify an appropriate matching delete operator).

    関数 void operator delete(void *, size_t) は、C++11 の placement new 関数 void * operator new(size_t, size_t) に対応する placement delete 演算子でした。The function void operator delete(void *, size_t) was a placement delete operator corresponding to the placement new function void * operator new(size_t, size_t) in C++11. C++ 14 サイズの割り当て解除で delete は、この関数は 通常の解放関数 (グローバル演算子) になりました deleteWith C++14 sized deallocation, this delete function is now a usual deallocation function (global delete operator). 標準では、 placement new の使用で対応する関数が検索され、 delete 通常の解放関数が検出された場合、プログラムの形式が不適切であることが必要です。The standard requires that if the use of a placement new looks up a corresponding delete function and finds a usual deallocation function, the program is ill-formed.

    たとえば、コードで placement newplacement delete の両方を定義するとします。For example, suppose your code defines both a placement new and a placement delete:

      void * operator new(std::size_t, std::size_t);
      void operator delete(void*, std::size_t) noexcept;
    

    この問題が発生するのは、定義した placement delete 演算子と新しいグローバルサイズ演算子の間の関数シグネチャが一致したため delete です。The problem occurs because of the match in function signatures between a placement delete operator you've defined, and the new global sized delete operator. 別の型を使用できるかどうかを検討してください、 size_t 配置の新しいdelete 演算子。Consider whether you can use a different type other than size_t for any placement new and delete operators. の型はコンパイラに依存していることに注意して size_t typedef ください。これは typedef Visual C++ ののです unsigned intNote that the type of the size_t typedef is compiler-dependent; it is a typedef for unsigned int in Visual C++. 適切なソリューションでは、次のように列挙型を使用します。A good solution is to use an enumerated type such as this:

      enum class my_type : size_t {};
    

    次に、配置の定義を変更し、この型をでは new delete なく2番目の引数として使用し size_t ます。Then, change your definition of placement new and delete to use this type as the second argument instead of size_t. また、 placement new の呼び出しを更新して新しい型を渡す (たとえば、を使用して static_cast<my_type> 整数値から変換する) 必要があります。また、との定義を更新し、 new delete 整数型にキャストバックする必要もあります。You'll also need to update the calls to placement new to pass the new type (for example, by using static_cast<my_type> to convert from the integer value) and update the definition of new and delete to cast back to the integer type. このためにを使用する必要はありません enum 。メンバーを持つクラス型 size_t も機能します。You don't need to use an enum for this; a class type with a size_t member would also work.

    代わりの方法として、placement new を完全に除去することもできます。An alternative solution is that you might be able to eliminate the placement new altogether. 配置の引数が割り当てまたは削除されるオブジェクトのサイズであるメモリプールを実装するために、 配置の新しい 機能が使用されている場合、サイズの割り当て解除機能は、独自のカスタムメモリプールコードを置き換えるのに適しています。また、配置関数の代わりに独自の2つの引数演算子を使用することもでき delete ます。If your code uses placement new to implement a memory pool where the placement argument is the size of the object being allocated or deleted, then sized deallocation feature might be suitable to replace your own custom memory pool code, and you can get rid of the placement functions and just use your own two-argument delete operator instead of the placement functions.

    コードを即時に更新しない場合は、コンパイラ オプション /Zc:sizedDealloc- を使用して、従来の動作に戻すことができます。If you don't want to update your code immediately, you can revert to the old behavior by using the compiler option /Zc:sizedDealloc-. このオプションを使用すると、2つの引数を delete 持つ関数は存在せず、 placement delete 演算子との競合は発生しません。If you use this option, the two-argument delete functions don't exist and won't cause a conflict with your placement delete operator.

  • 共用体データ メンバーUnion data members

    共用体データ メンバーで参照型を使用することはできなくなりました。Data members of unions can no longer have reference types. 次のコードは Visual Studio 2013 では正常にコンパイルされますが、Visual Studio 2015 ではエラーになります。The following code compiled successfully in Visual Studio 2013, but produces an error in Visual Studio 2015.

      union U1 {
          const int i;
      };
      union U2 {
         int &i;
      };
      union U3 {
          struct {int &i;};
      };
    

    上のコードを実行すると、次のエラーが生成されます。The preceding code produces the following errors:

      test.cpp(67): error C2625: 'U2::i': illegal union member; type 'int &' is reference type
      test.cpp(70): error C2625: 'U3::i': illegal union member; type 'int &' is reference type
    

    この問題に対処するには、参照型をポインターか値に変更します。To address this issue, change reference types either to a pointer or a value. ポインターに型を変更する場合、共用体フィールドを使用するコードでの変更が必要です。Changing the type to a pointer requires changes in the code that uses the union field. コードを値に変更すると、共用体に格納されているデータが変更されます。これは、他のフィールドに影響を与えます。共用体型のフィールドは同じメモリを共有するからです。Changing the code to a value would change the data stored in the union, which affects other fields since fields in union types share the same memory. 値のサイズによっては、共用体のサイズも変更される場合があります。Depending on the size of the value, it might also change the size of the union.

  • 匿名共用体Anonymous unions

    の標準への適合が改善されました。are now more conformant to the standard. 以前のバージョンのコンパイラでは、匿名共用体に対して明示的なコンストラクターとデストラクターが生成されていました。Previous versions of the compiler generated an explicit constructor and destructor for anonymous unions. これらは Visual Studio 2015 で削除されています。These are deleted in Visual Studio 2015.

    struct S {
        S();
    };
    
    union {
        struct {
           S s;
        };
    } u; // C2280
    

    上のコードを実行すると、Visual Studio 2015 で次のエラーが生成されます。The preceding code generates the following error in Visual Studio 2015:

      error C2280: '<unnamed-type-u>::<unnamed-type-u>(void)': attempting to reference a deleted function
      note: compiler has generated '<unnamed-type-u>::<unnamed-type-u>' here
    

    この問題を解決するには、コンストラクターおよび/またはデストラクターの独自の定義を提供してください。To resolve this issue, provide your own definitions of the constructor and/or destructor.

      struct S {
         // Provide a default constructor by adding an empty function body.
         S() {}
      };
    
      union {
         struct {
            S s;
         };
      } u;
    
  • 匿名構造体を持つ共用体Unions with anonymous structs

    標準と準拠させるために、共用体の匿名構造体メンバーのランタイムの動作が変更されました。In order to conform with the standard, the runtime behavior has changed for members of anonymous structures in unions. 共用体の匿名構造体のメンバーのコンストラクターは、そのような共用体の作成時に暗黙的に呼び出されなくなりました。The constructor for anonymous structure members in a union is no longer implicitly called when such a union is created. また、共用体の匿名構造体のメンバーのデストラクターも、共用体がスコープから外れたときに暗黙的に呼び出されなくなりました。Also, the destructor for anonymous structure members in a union is no longer implicitly called when the union goes out of scope. 次のコードを検討します。共用体 U に匿名構造体が含まれています。この匿名構造体には、名前付き構造体 S のメンバーが含まれており、その構造体にはデストラクターが含まれています。Consider the following code, in which a union U contains an anonymous structure that contains a member which is a named structure S that has a destructor.

      #include <stdio.h>
      struct S {
          S() { printf("Creating S\n"); }
          ~S(){ printf("Destroying S\n"); }
      };
      union U {
          struct {
          S s;
      };
          U() {}
          ~U(){}
      };
    
      void f()
      {
          U u;
          // Destructor implicitly called here.
      }
    
      int main()
      {
          f();
    
          char s[1024];
          printf("Press any key.\n");
          gets_s(s);
          return 0;
      }
    

    Visual Studio 2013 では、S のコンストラクターは共用体の作成時に呼び出され、S のデストラクターは関数 f のスタックがクリーンアップされるときに呼び出されます。In Visual Studio 2013, the constructor for S is called when the union is created, and the destructor for S is called when the stack for function f is cleaned up. しかし、Visual Studio 2015 では、コンストラクターとデストラクターは呼び出されません。But in Visual Studio 2015, the constructor and destructor are not called. コンパイラによって、この動作の変更に関する警告が出されます。The compiler gives a warning about this behavior change.

      warning C4587: 'U::s': behavior change: constructor is no longer implicitly calledwarning C4588: 'U::s': behavior change: destructor is no longer implicitly called
    

    元の動作を復元するには、匿名構造体に名前を付けます。To restore the original behavior, give the anonymous structure a name. 非匿名構造体の実行時の動作は、コンパイラのバージョンに関係なく、同じです。The runtime behavior of non-anonymous structures is the same, regardless of the compiler version.

      #include <stdio.h>
    
      struct S {
          S() { printf("Creating S.\n"); }
          ~S() { printf("Destroying S\n"); }
      };
      union U {
          struct {
              S s;
          } namedStruct;
          U() {}
          ~U() {}
      };
    
      void f()
      {
          U u;
      }
    
      int main()
      {
          f();
    
          char s[1024];
          printf("Press any key.\n");
          gets_s(s);
          return 0;
      }
    

    別の方法として、新しい関数にコンストラクターとデストラクターのコードを移動し、共用体のコンストラクターおよびデストラクターからこれらの関数の呼び出しを追加します。Alternatively, try moving the constructor and destructor code into new functions, and add calls to these functions from the constructor and destructor for the union.

      #include <stdio.h>
    
      struct S {
          void Create() { printf("Creating S.\n"); }
          void Destroy() { printf("Destroying S\n"); }
      };
      union U {
          struct {
              S s;
          };
          U() { s.Create();  }
          ~U() { s.Destroy(); }
      };
    
      void f()
      {
          U u;
      }
    
      int main()
      {
          f();
    
      char s[1024];
      printf("Press any key.\n");
      gets_s(s);
      return 0;
      }
    
  • テンプレートの解決Template resolution

    テンプレートの名前解決に変更が加えられています。Changes have been made to name resolution for templates. C++ では、名前解決の候補を検討する場合、一致の可能性として検討されている 1 つ以上の名前により、無効なテンプレート インスタンス化が生成される可能性があります。In C++, when considering candidates for the resolution of a name, it can be the case that one or more names under consideration as potential matches produces an invalid template instantiation. これらの無効なインスタンス化は通常、それ自体はコンパイラ エラーの原因にはなりません。これは SFINAE (Substitution Failure Is Not An Error: 置き換えの失敗はエラーではない) と呼ばれます。These invalid instantiations do not normally cause compiler errors, a principle which is known as SFINAE (Substitution Failure Is Not An Error).

    SFINAE のコンパイラがクラス テンプレートの特殊化のインスタンス化を必要とする場合は、この処理中に発生したエラーはコンパイラ エラーです。Now, if SFINAE requires the compiler to instantiate the specialization of a class template, then any errors that occur during this process are compiler errors. 以前のバージョンでは、コンパイラはこのようなエラーを無視していました。In previous versions, the compiler would ignore such errors. 次に例を示します。For example, consider the following code:

      #include <type_traits>
    
      template<typename T>
      struct S
      {
      S() = default;
      S(const S&);
      S(S&&);
    
      template<typename U, typename = typename std::enable_if<std::is_base_of<T, U>::value>::type>
      S(S<U>&&);
      };
    
      struct D;
    
      void f1()
      {
      S<D> s1;
          S<D> s2(s1);
      }
    
      struct B
      {
      };
    
      struct D : public B
      {
      };
    
      void f2()
      {
      S<D> s1;
          S<D> s2(s1);
      }
    

    現在のコンパイラでコンパイルすると、次のエラーが表示されます。If you compile with the current compiler, you get the following error:

      type_traits(1110): error C2139: 'D': an undefined class is not allowed as an argument to compiler intrinsic type trait '__is_base_of'
      ..\t331.cpp(14): note: see declaration of 'D'
      ..\t331.cpp(10): note: see reference to class template instantiation 'std::is_base_of<T,U>' being compiled
              with
              [
                  T=D,
                  U=D
              ]
    

    これは、is_base_of の最初の呼び出しの時点でクラス 'D' がまだ定義されていないためです。This is because at the point of the first invocation of the is_base_of the class 'D' has not yet been defined.

    この場合の修正は、クラスが定義されるまでそのような型の特徴を使用しないことです。In this case, the fix is not to use such type traits until the class has been defined. B と D の定義をコード ファイルの先頭に移動すると、エラーが解決されます。If you move the definitions of B and D to the beginning of the code file, the error is resolved. 定義がヘッダー ファイルにある場合、ヘッダー ファイルの include ステートメントの順序を確認し、問題のあるテンプレートが使用される前にクラス定義がコンパイルされるようにしてください。If the definitions are in header files, check the order of the include statements for the header files to make sure that any class definitions are compiled before the problematic templates are used.

  • コピー コンストラクターCopy constructors

    Visual Studio 2013 と Visual Studio 2015 の両方において、コンパイラは、クラスにユーザー定義の移動コンストラクターがあり、ユーザー定義のコピー コンストラクターはない場合に、そのクラスのコピー コンストラクターを生成します。In both Visual Studio 2013 and Visual Studio 2015, the compiler generates a copy constructor for a class if that class has a user-defined move constructor but no user-defined copy constructor. Dev14 では、この暗黙的に生成されたコピー コンストラクターは "= delete" とマークされています。In Dev14, this implicitly generated copy constructor is also marked "= delete".

Visual Studio 2015 Update 1 での準拠の強化Conformance Improvements in Visual Studio 2015 Update 1

  • プライベートの仮想基底クラスと間接継承Private virtual base classes and indirect inheritance

    以前のバージョンのコンパイラでは、派生クラスは間接的に派生した private virtual基本クラスのメンバー関数を呼び出すことができました。Previous versions of the compiler allowed a derived class to call member functions of its indirectly-derived private virtual base classes. この従来の動作は正しい動作ではなく、C++ 標準に準拠していません。This old behavior was incorrect and does not conform to the C++ standard. コンパイラはこの方法で記述されたコードを受け入れなくなりました。その結果、コンパイラ エラー C2280 を発行します。The compiler no longer accepts code written in this way and issues compiler error C2280 as a result.

      error C2280: 'void *S3::__delDtor(unsigned int)': attempting to reference a deleted function
    

    例 (変更前)Example (before)

      class base
      {
      protected:
          base();
          ~base();
      };
    
      class middle: private virtual base {};class top: public virtual middle {};
    
      void destroy(top *p)
      {
          delete p;  //
      }
    

    例 (変更後)Example (after)

      class base;  // as above
    
      class middle: protected virtual base {};
      class top: public virtual middle {};
    
      void destroy(top *p)
      {
          delete p;
      }
    

    - または --or-

      class base;  // as above
    
      class middle: private virtual base {};
      class top: public virtual middle, private virtual bottom {};
    
      void destroy(top *p)
      {
          delete p;
      }
    
  • オーバーロードされた operator new と operator deleteOverloaded operator new and operator delete

    以前のバージョンのコンパイラでは、メンバー以外の operator new とメンバー以外の operator delete を static として宣言することや、グローバル名前空間以外の名前空間で宣言することが許可されていました。Previous versions of the compiler allowed non-member operator new and non-member operator delete to be declared static, and to be declared in namespaces other than the global namespace. この以前の動作により、プログラマが意図したまたは演算子の実装をプログラムが呼び出さないというリスクが生じ、その new delete 結果、実行時に異常な動作が発生します。This old behavior created a risk that the program would not call the new or delete operator implementation that the programmer intended, resulting in silent bad runtime behavior. コンパイラはこの方法で記述されたコードを受け入れなくなりました。代わりにコンパイラ エラー C2323 を発行します。The compiler no longer accepts code written in this way and issues compiler error C2323 instead.

      error C2323: 'operator new': non-member operator new or delete functions may not be declared static or in a namespace other than the global namespace.
    

    例 (変更前)Example (before)

      static inline void * __cdecl operator new(size_t cb, const std::nothrow_t&)  // error C2323
    

    例 (変更後)Example (after)

      void * __cdecl operator new(size_t cb, const std::nothrow_t&)  // removed 'static inline'
    

    また、コンパイラは特定の診断を行いませんが、インラインの operator new の形式は不適切であると見なされます。Additionally, although the compiler doesn't give a specific diagnostic, inline operator new is considered ill-formed.

  • 非クラス型で 'operator type()' (ユーザー定義の変換) を呼び出す 以前のバージョンのコンパイラでは 'operator type()' を非クラス型で呼び出すことが許可されていましたが、それは何の警告もなく無視されていました。Calling 'operator type()' (user-defined conversion) on non-class types Previous versions of the compiler allowed 'operator type()' to be called on non-class types while silently ignoring it. この従来の動作のせいで、問題のあるコードが警告なしに生成される危険性が生じ、結果として、予期しないランタイム動作の原因となっていました。This old behavior created a risk of silent bad code generation, resulting in unpredictable runtime behavior. コンパイラはこの方法で記述されたコードを受け入れなくなりました。代わりにコンパイラ エラー C2228 を発行します。The compiler no longer accepts code written in this way and issues compiler error C2228 instead.

      error C2228: left of '.operator type' must have class/struct/union
    

    例 (変更前)Example (before)

      typedef int index_t;
    
      void bounds_check(index_t index);
    
      void login(int column)
      {
          bounds_check(column.operator index_t());  // error C2228
      }
    

    例 (変更後)Example (after)

      typedef int index_t;
    
      void bounds_check(index_t index);
    
      void login(int column)
      {
           bounds_check(column);  // removed cast to 'index_t', 'index_t' is an alias of 'int'
      }
    
  • 詳細な型指定子の冗長な typename 以前のバージョンのコンパイラは、詳細 typename な型指定子で使用できます。この方法で記述されたコードは意味が正しくありません。Redundant typename in elaborated type specifiers Previous versions of the compiler allowed typename in an elaborated type specifiers; code written in this way is semantically incorrect. コンパイラはこの方法で記述されたコードを受け入れなくなりました。代わりにコンパイラ エラー C3406 を発行します。The compiler no longer accepts code written in this way and issues compiler error C3406 instead.

      error C3406: 'typename' cannot be used in an elaborated type specifier
    

    例 (変更前)Example (before)

      template <typename class T>
      class container;
    

    例 (変更後)Example (after)

      template <class T>  // alternatively, could be 'template <typename T>'; 'typename' is not elaborating a type specifier in this case
      class container;
    
  • 初期化子リストからの配列の型推論 以前のバージョンのコンパイラでは、初期化子リストからの配列の型推論はサポートされていませんでした。Type deduction of arrays from an initializer list Previous versions of the compiler did not support type deduction of arrays from an initializer list. コンパイラでこの形式の型推論がサポートされるようになりました。その結果、初期化子リストを使用した関数テンプレートへの呼び出しがあいまいになったり、以前のバージョンのコンパイラとは異なるオーバーロードが選ばれたりする可能性があります。The compiler now supports this form of type deduction and, as a result, calls to function templates using initializer lists might now be ambiguous or a different overload might be chosen than in previous versions of the compiler. これらの問題を解決するには、プログラマの意図したオーバーロードをプログラムが明示的に指定する必要があります。To resolve these issues, the program must now explicitly specify the overload that the programmer intended.

    この新しい動作により、オーバーロードの解決で過去の候補と同程度に優れた追加候補が検討されると、呼び出しはあいまいになり、結果としてコンパイラはコンパイラ エラー C2668 を発行します。When this new behavior causes overload resolution to consider an additional candidate that is equally as good as the historic candidate, the call becomes ambiguous and the compiler issues compiler error C2668 as a result.

      error C2668: 'function' : ambiguous call to overloaded function.
    

    例 1: オーバーロード関数のあいまいな呼び出し (変更前)Example 1: Ambiguous call to overloaded function (before)

      // In previous versions of the compiler, code written in this way would unambiguously call f(int, Args...)
      template <typename... Args>
      void f(int, Args...);  //
    
      template <int N, typename... Args>
      void f(const int (&)[N], Args...);
    
      int main()
      {
          // The compiler now considers this call ambiguous, and issues a compiler error
          f({3});  error C2668: 'f' ambiguous call to overloaded function
      }
    

    例 1: オーバーロード関数のあいまいな呼び出し (変更後)Example 1: ambiguous call to overloaded function (after)

      template <typename... Args>
      void f(int, Args...);  //
    
      template <int N, typename... Args>
      void f(const int (&)[N], Args...);
    
      int main()
      {
          // To call f(int, Args...) when there is just one expression in the initializer list, remove the braces from it.
          f(3);
      }
    

    この新しい動作により、オーバーロードの解決で過去の候補よりも適合度の高い追加候補が検討されると、呼び出しはあいまいにならずに新しい候補に解決され、プログラムの動作は変化します。これはプログラマの意図した動作とは異なる場合があります。When this new behavior causes overload resolution to consider an additional candidate that is a better match than the historic candidate, the call resolves unambiguously to the new candidate, causing a change in program behavior that is probably different than the programmer intended.

    例 2: オーバーロードの解決の変更 (変更前)Example 2: change in overload resolution (before)

      // In previous versions of the compiler, code written in this way would unambiguously call f(S, Args...)
      struct S
      {
          int i;
          int j;
      };
    
      template <typename... Args>
      void f(S, Args...);
    
      template <int N, typename... Args>
      void f(const int *&)[N], Args...);
    
      int main()
      {
          // The compiler now resolves this call to f(const int (&)[N], Args...) instead
          f({1, 2});
      }
    

    例 2: オーバーロードの解決の変更 (変更後)Example 2: change in overload resolution (after)

      struct S;  // as before
    
      template <typename... Args>
      void f(S, Args...);
    
      template <int N, typename... Args>
      void f(const int *&)[N], Args...);
    
      int main()
      {
          // To call f(S, Args...), perform an explicit cast to S on the initializer list.
          f(S{1, 2});
      }
    
  • switch ステートメントの警告の復元Restoration of switch statement warnings

    以前のバージョンのコンパイラでは、ステートメントに関連する既存の警告が削除されました。 switch これらの警告は復元されました。A Previous version of the compiler removed previously-existing warnings related to switch statements; these warnings have now been restored. コンパイラは復元された警告を発行するようになり、特定の case (既定の case を含む) に関連する警告が、switch ステートメントの最後の行ではなく、問題のある case を含む行で発行されるようになりました。The compiler now issues the restored warnings, and warnings related to specific cases (including the default case) are now issued on the line containing the offending case, rather than on the last line of the switch statement. この結果、以前とは異なる行でそれらの警告が発行されるようになり、以前は #pragma warning(disable:####) を使用して抑制できていた警告も、意図どおりに抑制できなくなる可能性があります。As a result of now issuing those warnings on different lines than in the past, warnings previously suppressed by using #pragma warning(disable:####) may no longer be suppressed as intended. 意図どおりにこれらの警告を抑制するには、問題がある可能性のある最初の case の上の行まで #pragma warning(disable:####) ディレクティブを移動しなければならない場合があります。To suppress these warnings as intended, it might be necessary to move the #pragma warning(disable:####) directive to a line above the first potentially-offending case. 復元された警告を次に示します。The following are the restored warnings.

      warning C4060: switch statement contains no 'case' or 'default' labels
    
      warning C4061: enumerator 'bit1' in switch of enum 'flags' is not explicitly handled by a case label
    
      warning C4062: enumerator 'bit1' in switch of enum 'flags' is not handled
    
      warning C4063: case 'bit32' is not a valid value for switch of enum 'flags'
    
      warning C4064: switch of incomplete enum 'flags'
    
      warning C4065: switch statement contains 'default' but no 'case' labels
    
      warning C4808: case 'value' is not a valid value for switch condition of type 'bool'
    
      Warning C4809: switch statement has redundant 'default' label; all possible 'case' labels are given
    

    C4063 の例 (変更前)Example of C4063 (before)

      class settings
      {
      public:
          enum flags
          {
              bit0 = 0x1,
              bit1 = 0x2,
              ...
          };
          ...
      };
    
      int main()
      {
          auto val = settings::bit1;
    
          switch (val)
          {
          case settings::bit0:
              break;
    
          case settings::bit1:
              break;
    
          case settings::bit0 | settings::bit1:  // warning C4063
              break;
          }
      };
    

    C4063 の例 (変更後)Example of C4063 (after)

      class settings {...};  // as above
    
      int main()
      {
          // since C++11, use std::underlying_type to determine the underlying type of an enum
          typedef std::underlying_type<settings::flags>::type flags_t;
    
          auto val = settings::bit1;
    
          switch (static_cast<flags_t>(val))
          {
          case settings::bit0:
              break;
    
          case settings::bit1:
              break;
    
          case settings::bit0 | settings::bit1:  // ok
              break;
          }
      };
    

    その他の復元の警告の例については、それらのドキュメントをご覧ください。Examples of the other restored warnings are provided in their documentation.

  • #include: パス名で親ディレクトリの指定子 '..' を使用する (/Wall /WX にのみ影響)#include: use of parent-directory specifier '..' in pathname (only affects /Wall /WX)

    以前のバージョンのコンパイラでは、親ディレクトリの指定子の使用が検出されませんでした '… 'Previous versions of the compiler did not detect the use of the parent-directory specifier '..' パス名で #include ディレクティブです。in the pathname of #include directives. この方法で記述されたコードは通常、プロジェクトの相対パスが正しく使用されていないためにプロジェクトの外部に存在するヘッダーをインクルードすることを目的としています。Code written in this way is usually intended to include headers that exist outside of the project by incorrectly using project-relative paths. この従来の動作のせいで、プログラマが意図したものとは異なるソース ファイルをインクルードしてプログラムがコンパイルされる危険性や、これらの相対パスを他のビルド環境に移植できない危険性が生じました。This old behavior created a risk that the program could be compiled by including a different source file than the programmer intended, or that these relative paths would not be portable to other build environments. コンパイラは、この方法で書かれたコードを検出してプログラマに通知し、有効な場合にはオプションのコンパイラ警告 C4464 を発行するようになりました。The compiler now detects and notifies the programmer of code written in this way and issues an optional compiler warning C4464, if enabled.

      warning C4464: relative include path contains '..'
    

    例 (変更前)Example (before)

      #include "..\headers\C4426.h"  // emits warning C4464
    

    例 (変更後)Example (after)

      #include "C4426.h"  // add absolute path to 'headers\' to your project's include directories
    

    さらに、コンパイラは特定の診断を示しませんが、プロジェクトのインクルード ディレクトリを指定する場合、親ディレクトリの指定子".." を使用することもお勧めします。Additionally, although the compiler does not give a specific diagnostic, we also recommend that the parent-directory specifier ".." should note be used to specify your project's include directories.

  • #pragma optimize() がヘッダー ファイルの終わりを超える (/Wall /WX にのみ影響)#pragma optimize() extends past end of header file (only affects /Wall /WX)

    以前のバージョンのコンパイラでは、翻訳単位内に含まれるヘッダー ファイルをエスケープする最適化フラグの設定の変更は検出されませんでした。Previous versions of the compiler did not detect changes to optimization flag settings that escape a header file included within a translation unit. コンパイラは、この方法で書かれたコードを検出してプログラマに通知し、有効な場合には、問題のある #includeの位置でオプションのコンパイラ警告 C4426 を発行するようになりました。The compiler now detects and notifies the programmer of code written in this way and issues an optional compiler warning C4426 at the location of the offending #include, if enabled. この警告が発行されるのは、この変更が、コンパイラに対するコマンドライン引数によって設定された最適化フラグと競合する場合のみです。This warning is only issued if the changes conflict with the optimization flags set by command-line arguments to the compiler.

      warning C4426: optimization flags changed after including header, may be due to #pragma optimize()
    

    例 (変更前)Example (before)

      // C4426.h
      #pragma optimize("g", off)
      ...
      // C4426.h ends
    
      // C4426.cpp
      #include "C4426.h"  // warning C4426
    

    例 (変更後)Example (after)

      // C4426.h
      #pragma optimize("g", off)
      ...
      #pragma optimize("", on)  // restores optimization flags set via command-line arguments
      // C4426.h ends
    
      // C4426.cpp
      #include "C4426.h"
    
  • #pragma warning(push)#pragma warning(pop) の不一致 (/Wall /WX にのみ影響)Mismatched #pragma warning(push) and #pragma warning(pop) (only affects /Wall /WX)

    以前のバージョンのコンパイラでは、#pragma warning(push) の状態の変更が、異なるソース ファイルの #pragma warning(pop) 状態の変更とペアになっていても (故意であることはまれですが)、それを検出しませんでした。Previous versions of the compiler did not detect #pragma warning(push) state changes being paired with #pragma warning(pop) state changes in a different source file, which is rarely intended. この従来の動作のせいで、プログラマの意図と異なる一連の警告が有効な状態でプログラムがコンパイルされる危険性が生じ、結果として、問題のあるランタイム動作が警告なしに発生する原因となっていました。This old behavior created a risk that the program would be compiled with a different set of warnings enabled than the programmer intended, possibly resulting in silent bad runtime behavior. コンパイラは、この方法で書かれたコードを検出してプログラマに通知し、有効な場合には、一致する #pragma warning(pop) の位置でオプションのコンパイラの警告 C5031 を発行するようになりました。The compiler now detects and notifies the programmer of code written in this way and issues an optional compiler warning C5031 at the location of the matching #pragma warning(pop), if enabled. この警告には、対応する #pragma warning(push) の場所を参照するメモが含まれます。This warning includes a note referencing the location of the corresponding #pragma warning(push).

      warning C5031: #pragma warning(pop): likely mismatch, popping warning state pushed in different file
    

    例 (変更前)Example (before)

      // C5031_part1.h
      #pragma warning(push)
      #pragma warning(disable:####)
      ...
      // C5031_part1.h ends without #pragma warning(pop)
    
      // C5031_part2.h
      ...
      #pragma warning(pop)  // pops a warning state not pushed in this source file
      ...
      // C5031_part1.h ends
    
      // C5031.cpp
      #include "C5031_part1.h" // leaves #pragma warning(push) 'dangling'
      ...
      #include "C5031_part2.h" // matches 'dangling' #pragma warning(push), resulting in warning C5031
      ...
    

    例 (変更後)Example (after)

      // C5031_part1.h
      #pragma warning(push)
      #pragma warning(disable:####)
      ...
      #pragma warning(pop)  // pops the warning state pushed in this source file
      // C5031_part1.h ends without #pragma warning(pop)
    
      // C5031_part2.h
      #pragma warning(push)  // pushes the warning state pushed in this source file
      #pragma warning(disable:####)
      ...
      #pragma warning(pop)
      // C5031_part1.h ends
    
      // C5031.cpp
      #include "C5031_part1.h" // #pragma warning state changes are self-contained and independent of other source files or their #include order.
      ...
      #include "C5031_part2.h"
      ...
    

    一般的ではありませんが、意図的にこの方法でコードを記述する場合があります。Though uncommon, code written in this way is sometimes intentional. この方法で記述されたコードは #include の順序の変更の影響を受けます。可能な場合は、自己完結型の方法を使用してソース コード ファイルで警告状態を管理することをお勧めします。Code written in this way is sensitive to changes in #include order; when possible, we recommend that source code files manage warning state in a self-contained way.

  • 一致していない #pragma warning(push) (/Wall /WX にのみ影響)Unmatched #pragma warning(push) (only affects /Wall /WX)

    以前のバージョンのコンパイラでは、翻訳単位の末尾で一致していない #pragma warning(push) の状態の変更は検出されませんでした。Previous versions of the compiler did not detect unmatched #pragma warning(push) state changes at the end of a translation unit. コンパイラは、この方法で書かれたコードを検出してプログラマに通知し、有効な場合には、一致していない #pragma warning(push) の位置でオプションのコンパイラ警告 C5032 を発行するようになりました。The compiler now detects and notifies the programmer of code written in this way and issues an optional compiler warning C5032 at the location of the unmatched #pragma warning(push), if enabled. この警告が発行されるのは、翻訳単位にコンパイル エラーがない場合のみです。This warning is only issued if there are no compilation errors in the translation unit.

      warning C5032: detected #pragma warning(push) with no corresponding #pragma warning(pop)
    

    例 (変更前)Example (before)

      // C5032.h
      #pragma warning(push)
      #pragma warning(disable:####)
      ...
      // C5032.h ends without #pragma warning(pop)
    
      // C5032.cpp
      #include "C5032.h"
      ...
      // C5032.cpp ends -- the translation unit is completed without #pragma warning(pop), resulting in warning C5032 on line 1 of C5032.h
    

    例 (変更後)Example (after)

      // C5032.h
      #pragma warning(push)
      #pragma warning(disable:####)
      ...
      #pragma warning(pop) // matches #pragma warning (push) on line 1
      // C5032.h ends
    
      // C5032.cpp
      #include "C5032.h"
      ...
      // C5032.cpp ends -- the translation unit is completed without unmatched #pragma warning(push)
    
  • #pragma 警告状態の追跡が強化された結果、追加の警告が発行される場合があります。Additional warnings might be issued as a result of improved #pragma warning state tracking

    以前のバージョンのコンパイラでは、#pragma warning 状態の変化の追跡が不十分なため、すべての意図された警告を発行できませんでした。Previous versions of the compiler tracked #pragma warning state changes insufficiently well to issue all intended warnings. この動作により、プログラマの意図したものとは異なる状況で、事実上、特定の警告が抑制される危険性がありました。This behavior created a risk that certain warnings would be effectively suppressed in circumstances different than the programmer intended. コンパイラは #pragma warning 状態をより確実に追跡するようになりました (特にテンプレート内部での #pragma warning 状態の変化に関連するもの)。また #pragma warning(push)#pragma warning(pop)の意図しない使用をプログラマが見つける手助けとして、新しい警告 C5031 と C5032 を必要に応じて発行するようになりました。The compiler now tracks #pragma warning state more robustly -- especially related to #pragma warning state changes inside of templates -- and optionally issues new warnings C5031 and C5032 which are intended to help the programmer locate unintended uses of #pragma warning(push) and #pragma warning(pop).

    #pragma warning 状態の変更の追跡が強化された結果、以前は誤って抑制されていた警告、または以前は誤って診断されていた問題に関連する警告が発行されるようになる場合があります。As a result of improved #pragma warning state change tracking, warnings formerly incorrectly suppressed or warnings related to issues formerly misdiagnosed might now be issued.

  • 制御が渡らないコードの識別の強化Improved identification of unreachable code

    C++ 標準ライブラリが変更されたり、以前のバージョンのコンパイラよりも関数呼び出しのインライン化機能が強化されたりしたため、コンパイラは特定のコードに制御が渡らないことを示せるようになりました。C++ Standard Library changes and improved ability to inline function calls over previous versions of the compiler might allow the compiler to prove that certain code is now unreachable. この新しい動作の結果、警告 C4720 のインスタンスが新しく、あるいはより頻繁に発行される可能性があります。This new behavior can result in new and more-frequently issued instances of warning C4720.

      warning C4720: unreachable code
    

    多くの場合、この警告が発行されるのは、最適化を有効にしてコンパイルするときだけです。最適化により、より多くの関数呼び出しがインライン化されたり、冗長なコードが削除されたり、コードに制御が渡っていないことを他の方法で判別できるようになったりするためです。In many cases, this warning might only be issued when compiling with optimizations enabled, since optimizations may inline more function calls, eliminate redundant code, or otherwise make it possible to determine that certain code is unreachable. 警告 C4720 の新しいインスタンスが try/catch ブロックで頻繁に発生 (特に std::find の使用に関連して) していることが確認されています。We have observed that new instances of warning C4720 have frequently occurred in try/catch blocks, especially in relation to use of std::find.

    例 (変更前)Example (before)

      try
      {
          auto iter = std::find(v.begin(), v.end(), 5);
      }
      catch(...)
      {
          do_something();  // ok
      }
    

    例 (変更後)Example (after)

      try
      {
          auto iter = std::find(v.begin(), v.end(), 5);
      }
      catch(...)
      {
          do_something();  // warning C4702: unreachable code
      }
    

Visual Studio 2015 Update 2 での準拠の強化Conformance Improvements in Visual Studio 2015 Update 2

  • SFINAE 式の部分的なサポートの結果として、追加の警告とエラーが発行される場合があるAdditional warnings and errors might be issued as a result of partial support for expression SFINAE

    以前のバージョンのコンパイラは、SFINAE 式がサポートされていないため、指定子内の特定の種類の式を解析しませんでした decltypePrevious versions of the compiler did not parse certain kinds of expressions inside decltype specifiers due to lack of support for expression SFINAE. この従来の動作は正しい動作ではなく、C++ 標準に準拠していません。This old behavior was incorrect and does not conform to the C++ standard. コンパイラは、継続的な適合性の向上により、これらの式を解析し、SFINAE 式を部分的にサポートするようになりました。The compiler now parses these expressions and has partial support for expression SFINAE due to ongoing conformance improvements. その結果、コンパイラは、以前のバージョンのコンパイラが解析しなかった式で検出された警告とエラーを発行します。As a result, the compiler now issues warnings and errors found in expressions that previous versions of the compiler did not parse.

    この新しい動作によって、 decltype まだ宣言されていない型を含む式が解析されると、コンパイラはコンパイラエラー C2039 を結果として発行します。When this new behavior parses a decltype expression that includes a type that has not yet been declared, the compiler issues compiler error C2039 as a result.

      error C2039: 'type': is not a member of '`global namespace''
    

    例 1: 宣言されていない型の使用 (変更前)Example 1: use of an undeclared type (before)

      struct s1
      {
        template <typename T>
        auto f() -> decltype(s2<T>::type::f());  // error C2039
    
        template<typename>
        struct s2 {};
      }
    

    例 1 (変更後)Example 1 (after)

      struct s1
      {
        template <typename>  // forward declare s2struct s2;
    
        template <typename T>
        auto f() -> decltype(s2<T>::type::f());
    
        template<typename>
        struct s2 {};
      }
    

    この新しい動作によって、 decltype 依存名が型であることを指定するためにキーワードを使用する必要がない式が解析されると、コンパイラ typename はコンパイラの警告 C4346 をコンパイラエラー C2923 と共に発行します。When this new behavior parses a decltype expression that is missing a necessary use of the typename keyword to specify that a dependent name is a type, the compiler issues compiler warning C4346 together with compiler error C2923.

      warning C4346: 'S2<T>::Type': dependent name is not a type
    
      error C2923: 's1': 'S2<T>::Type' is not a valid template type argument for parameter 'T'
    

    例 2: 依存名が型ではない (変更前)Example 2: dependent name is not a type (before)

      template <typename T>
      struct s1
      {
        typedef T type;
      };
    
      template <typename T>
      struct s2
      {
        typedef T type;
      };
    
      template <typename T>
      T declval();
    
      struct s
      {
        template <typename T>
        auto f(T t) -> decltype(t(declval<S1<S2<T>::type>::type>()));  // warning C4346, error C2923
      };
    

    例 2 (変更後)Example 2 (after)

      template <typename T> struct s1 {...};  // as above
      template <typename T> struct s2 {...};  // as above
    
      template <typename T>
      T declval();
    
      struct s
      {
        template <typename T>
        auto f(T t) -> decltype(t(declval<S1<typename S2<T>::type>::type>()));
      };
    
  • volatile****メンバー変数は、暗黙的に定義されたコンストラクターと代入演算子を防ぎます以前のバージョンのコンパイラでは、メンバー変数を持つクラスで、 volatile 既定のコピー/移動コンストラクターと既定のコピー/移動代入演算子が自動的に生成されるようになりました。volatile member variables prevent implicitly defined constructors and assignment operators Previous versions of the compiler allowed a class that has volatile member variables to have default copy/move constructors and default copy/move assignment operators automatically generated. この従来の動作は正しい動作ではなく、C++ 標準に準拠していません。This old behavior was incorrect and does not conform to the C++ standard. コンパイラは、揮発性のメンバー変数を持つクラスが、非単純コンストラクションと代入演算子を持つとみなすようになりました。それにより、これらの演算子の既定の実装が自動的に生成されることを防止します。The compiler now considers a class that has volatile member variables to have non-trivial construction and assignment operators which prevents default implementations of these operators from being automatically generated. そのようなクラスが共用体 (またはクラス内の無名共用体) のメンバーである場合は、共用体のコピー/移動コンストラクターとコピー/移動代入演算子 (または無名共用体を含むクラス) は、暗黙的に削除済みとして定義されます。When such a class is a member of a union (or an anonymous union inside of a class), the copy/move constructors and copy/move assignment operators of the union (or the class containing the unonymous union) will be implicitly defined as deleted. 明示的に定義することなく、共用体 (または無名共用体を含むクラス) を構築またはコピーしようとするとエラーとなり、結果として、コンパイラはコンパイラ エラー C2280 を発行します。Attempting to construct or copy the union (or class containing the anonymous union) without explicitly defining them is an error and the compiler issues compiler error C2280 as a result.

      error C2280: 'B::B(const B &)': attempting to reference a deleted function
    

    例 (変更前)Example (before)

      struct A
      {
        volatile int i;
        volatile int j;
      };
    
      extern A* pa;
    
      struct B
      {
        union
        {
          A a;
          int i;
        };
      };
    
      B b1 {*pa};
      B b2 (b1);  // error C2280
    

    例 (変更後)Example (after)

      struct A
      {
        int i;int j;
      };
    
      extern volatile A* pa;
    
      A getA()  // returns an A instance copied from contents of pa
      {
        A a;
        a.i = pa->i;
        a.j = pa->j;
        return a;
      }
    
      struct B;  // as above
    
      B b1 {GetA()};
      B b2 (b1);  // error C2280
    
  • 静的メンバー関数は、CV 修飾子をサポートしていません。Static member functions do not support cv-qualifiers.

    以前のバージョンの Visual C++ 2015 は、静的メンバー関数が CV 修飾子を持つことを許可していました。Previous versions of Visual C++ 2015 allowed static member functions to have cv-qualifiers. この動作は、Visual C++ 2015 および Visual C++ 2015 Update 1 での回帰が原因です。Visual C++ 2013 および Visual C++ の以前のバージョンは、この方法で記述されたコードを拒否します。This behavior is due to a regression in Visual C++ 2015 and Visual C++ 2015 Update 1; Visual C++ 2013 and previous versions of Visual C++ reject code written in this way. Visual C++ 2015 および Visual C++ 2015 Update 1 の動作は正しいものではなく、C++ 標準に準拠していません。The behavior of Visual C++ 2015 and Visual C++ 2015 Update 1 is incorrect and does not conform to the C++ standard. Visual Studio 2015 Update 2 は、この方法で記述されたコードを拒否し、コンパイラ エラー C2511 を代わりに発行します。Visual Studio 2015 Update 2 rejects code written in this way and issues compiler error C2511 instead.

      error C2511: 'void A::func(void) const': overloaded member function not found in 'A'
    

    例 (変更前)Example (before)

      struct A
      {
        static void func();
      };
    
      void A::func() const {}  // C2511
    

    例 (変更後)Example (after)

      struct A
      {
        static void func();
      };
    
      void A::func() {}  // removed const
    
  • 列挙型の事前宣言は、WinRT コードでは許可されていません (/ZW にのみ影響)Forward declaration of enum is not allowed in WinRT code (affects /ZW only)

    Windows ランタイム (WinRT) 用にコンパイルされたコード enum では、コンパイラスイッチを使用して .Net Framework 用にマネージ C++ コードをコンパイルする場合と同様に、型を事前宣言することはできません /clrCode compiled for the Windows Runtime (WinRT) doesn't allow enum types to be forward declared, similarly to when managed C++ code is compiled for the .Net Framework using the /clr compiler switch. この動作により、列挙型のサイズが常にわかり、WinRT 型システムに正しくプロジェクションを実行することができます。This behavior is ensures that the size of an enumeration is always known and can be correctly projected to the WinRT type system. コンパイラは、この方法で記述されたコードを拒否し、コンパイラ エラー C3197 と共にコンパイラ エラー C2599 を発行します。The compiler rejects code written in this way and issues compiler error C2599 together with compiler error C3197.

      error C2599: 'CustomEnum': the forward declaration of a WinRT enum is not allowed
    
      error C3197: 'public': can only be used in definitions
    

    例 (変更前)Example (before)

      namespace A {
        public enum class CustomEnum: int32;  // forward declaration; error C2599, error C3197
      }
    
      namespace A {
        public enum class CustomEnum: int32
        {
          Value1
        };
      }
    
      public ref class Component sealed
      {
      public:
        CustomEnum f()
        {
          return CustomEnum::Value1;
        }
      };
    

    例 (変更後)Example (after)

                // forward declaration of CustomEnum removed
      namespace A {
        public enum class CustomEnum: int32
        {
          Value1
        };
      }
    
      public ref class Component sealed
      {
      public:
        CustomEnum f()
        {
          return CustomEnum::Value1;
        }
      };
    
  • オーバーロードされた非メンバー operator new と operator delete をインラインで宣言できない (レベル 1 (/W1) 既定で有効)Overloaded non-member operator new and operator delete may not be declared inline (Level 1 (/W1) on-by-default)

    以前のバージョンのコンパイラは、非メンバー operator newoperator delete 関数がインラインで宣言されるときに警告を発行しません。Previous versions of the compiler do not issue a warning when non-member operator new and operator delete functions are declared inline. この方法で記述されたコードは、形式が正しくなく (診断は必要なし)、new 演算子と delete 演算子の不一致 (特に、サイズ割り当て解除と共に使用された場合) から生じるメモリの問題を引き起こす可能性があります。この問題を診断するのは難しい場合があります。Code written in this way is ill-formed (no diagnostic required) and can cause memory issues resulting from mismatched new and delete operators (especially when used together with sized deallocation) that can be difficult to diagnose. コンパイラは警告 C4595 を発行するようになったので、この方法で記述されたコードを識別しやすくなりました。The compiler now issues compiler warning C4595 to help identify code written in this way.

      warning C4595: 'operator new': non-member operator new or delete functions may not be declared inline
    

    例 (変更前)Example (before)

      inline void* operator new(size_t sz)  // warning C4595
      {
        ...
      }
    

    例 (変更後)Example (after)

      void* operator new(size_t sz)  // removed inline
      {
        ...
      }
    

    この方法で記述されたコードを修正するには、演算子の定義をヘッダー ファイルから対応するソース ファイルに移動することが必要な場合があります。Fixing code that's written in this way might require that the operator definitions be moved out of a header file and into a corresponding source file.

Visual Studio 2015 Update 3 での準拠の強化Conformance Improvements in Visual Studio 2015 Update 3

  • std::is_convertable が self-assignment を検出するようになった (標準ライブラリ) 以前のバージョンの std::is_convertable type-trait は、コピー コンストラクターが削除済みまたはプライベートの場合、クラス型の自己代入を正しく検出していませんでした。std::is_convertable now detects self-assignment (standard library) Previous versions of the std::is_convertable type-trait did not correctly detect self-assignment of a class type when its copy constructor is deleted or private. これで、 std::is_convertable<>::value false 削除またはプライベートコピーコンストラクターを使用してクラス型に適用した場合、は正しくに設定されます。Now, std::is_convertable<>::value is correctly set to false when applied to a class type with a deleted or private copy constructor.

    この変更に関連するコンパイラの診断はありません。There is no compiler diagnostic associated with this change.

    Example

      #include <type_traits>
    
      class X1
      {
      public:
          X1(const X1&) = delete;
      };
    
      class X2
      {
      private:
          X2(const X2&);
      };
    
      static_assert(std::is_convertible<X1&, X1>::value, "BOOM");static_assert(std::is_convertible<X2&, X2>::value, "BOOM");
    

    以前のバージョンの Visual C++ では、 std::is_convertable<>::value が誤ってに設定されているため、この例の一番下にある静的なアサーションが成功し true ます。In previous versions of Visual C++, the static assertions at the bottom of this example pass because std::is_convertable<>::value was incorrectly set to true. これで、 std::is_convertable<>::value はに正しく設定され false 、静的なアサーションは失敗します。Now, std::is_convertable<>::value is correctly set to false, causing the static assertions to fail.

  • 既定値にされた、または削除された単純なコピー コンストラクターと移動コンストラクターのアクセス指定子の尊重Defaulted or deleted trivial copy and move constructors respect access specifiers

    以前のバージョンのコンパイラは、既定値にされた、または削除された単純なコピー コンストラクターと移動コンストラクターを呼び出し前に確認していませんでした。Previous versions of the compiler did not check the access specifier of defaulted or deleted trivial copy and move constructors before allowing them to be called. この従来の動作は正しい動作ではなく、C++ 標準に準拠していません。This old behavior was incorrect and does not conform to the C++ standard. 場合によっては、この従来の動作のせいで、問題のあるコードが警告なしに生成される危険性が生じ、結果として、予期しないランタイム動作の原因となっていました。In some cases, this old behavior created a risk of silent bad code generation, resulting in unpredictable runtime behavior. コンパイラは、既定値に指定された、または削除された単純なコピー コンストラクターと移動コンストラクターをチェックし、呼び出し可能かどうかを判断し、呼び出し不能と判断した場合に、コンパイラの警告 C2248 を結果として返します。The compiler now checks the access specifier of defaulted or deleted trivial copy and move constructors to determine whether it can be called, and if not, issues compiler warning C2248 as a result.

      error C2248: 'S::S' cannot access private member declared in class 'S'
    

    例 (変更前)Example (before)

      class S {
      public:
         S() = default;
      private:
          S(const S&) = default;
      };
    
      void f(S);  // pass S by value
    
      int main()
      {
          S s;
          f(s);  // error C2248, can't invoke private copy constructor
      }
    

    例 (変更後)Example (after)

      class S {
      public:
         S() = default;
      private:
          S(const S&) = default;
      };
    
      void f(const S&);  // pass S by reference
    
      int main()
      {
          S s;
          f(s);
      }
    
  • 属性が指定された ATL コードのサポートの非推奨化 (デフォルトでレベル 1 (/W1))Deprecation of attributed ATL code support (Level 1 (/W1) on-by-default)

    以前のバージョンのコンパイラは、属性が指定された ATL コードをサポートしていました。Previous versions of the compiler supported attributed ATL code. Visual C++ 2008 から始まった、属性が指定された ATL コードのサポートを停止する次のフェーズとして、属性が指定された ATL コードは非推奨とされました。As the next phase of removing support for attributed ATL code that began in Visual C++ 2008, attributed ATL code has been deprecated. コンパイラは、非推奨になったこの種類のコードを特定するために、コンパイラの警告 C4467 を発行するようになりました。The compiler now issues compiler warning C4467 to help identify this kind of deprecated code.

      warning C4467: Usage of ATL attributes is deprecated
    

    コンパイラからサポートが削除されるまで、属性が指定された ATL コードを今後も使い続ける場合は、/Wv:18 または /wd4467 コマンド ライン引数をコンパイラに渡すことで、またはソース コードに #pragma warning(disable:4467) を追加することで、この警告を無効にすることができます。If you want to continue using attributed ATL code until support is removed from the compiler, you can disable this warning by passing the /Wv:18 or /wd4467 command line arguments to the compiler, or by adding #pragma warning(disable:4467) in your source code.

    例 1 (変更前)Example 1 (before)

                [uuid("594382D9-44B0-461A-8DE3-E06A3E73C5EB")]
      class A {};
    

    例 1 (変更後)Example 1 (after)

      __declspec(uuid("594382D9-44B0-461A-8DE3-E06A3E73C5EB")) A {};
    

    非推奨になった ATL 属性の使用を防ぐために、次のコード例のように、IDL ファイルを作成する場合がありますSometimes you might need or want to create an IDL file to avoid the use deprecated ATL attributes, as in the example code below

    例 2 (変更後)Example 2 (before)

      [emitidl];
      [module(name="Foo")];
    
      [object, local, uuid("9e66a290-4365-11d2-a997-00c04fa37ddb")]
      __interface ICustom {
          HRESULT Custom([in] long l, [out, retval] long *pLong);
          [local] HRESULT CustomLocal([in] long l, [out, retval] long *pLong);
      };
    
      [coclass, appobject, uuid("9e66a294-4365-11d2-a997-00c04fa37ddb")]
      class CFoo : public ICustom
      {
          // ...
      };
    

    まず、*.idl ファイルを作成します。vc140.idl で生成されるファイルを使用して、インターフェイスと注釈を含む *.idl ファイルを取得することができます。First, create the *.idl file; the vc140.idl generated file can be used to obtain an *.idl file containing the interfaces and annotations.

    次に、MIDL 手順をビルドに追加し、C++ インターフェイス定義が生成されるようにします。Next, add a MIDL step to your build to make sure that the C++ interface definitions are generated.

    例 2 IDL (変更後)Example 2 IDL (after)

      import "docobj.idl";
    
      [
          object,local,uuid(9e66a290-4365-11d2-a997-00c04fa37ddb)
      ]
    
      interface ICustom : IUnknown {
          HRESULT  Custom([in] long l, [out,retval] long *pLong);
          [local] HRESULT  CustomLocal([in] long l, [out,retval] long *pLong);
      };
    
      [ version(1.0), uuid(29079a2c-5f3f-3325-99a1-3ec9c40988bb) ]
      library Foo
      {
          importlib("stdole2.tlb");
          importlib("olepro32.dll");
              [
                  version(1.0),
                  appobject,uuid(9e66a294-4365-11d2-a997-00c04fa37ddb)
              ]
    
          coclass CFoo {
              interface ICustom;
          };
      }
    

    次に、以下のコード例のように、実装ファイルで ATL を直接使用します。Then, use ATL directly in the implementation file, as in the example code below.

    例 2 実装 (変更後)Example 2 Implementation (after)

      #include <idl.header.h>
      #include <atlbase.h>
    
      class ATL_NO_VTABLE CFooImpl :
          public ICustom,
          public ATL::CComObjectRootEx<CComMultiThreadModel>
      {
      public:
          BEGIN_COM_MAP(CFooImpl)
          COM_INTERFACE_ENTRY(ICustom)
          END_COM_MAP()
      };
    
  • プリコンパイル済みヘッダー (PCH) ファイルと一致しない #include ディレクティブ (/Wall /WX にのみ影響)Precompiled header (PCH) files and mismatched #include directives (only affects /Wall /WX)

    以前のバージョンのコンパイラは、プリコンパイル済みヘッダー (PCH) ファイルの使用時に、-Yc-Yu のコンパイル間のソース ファイルの #include ディレクティブ一致しない場合でも、受け入れていました。Previous versions of the compiler accepted mismatched #include directives in source files between -Yc and -Yu compilations when using precompiled header (PCH) files. この方法で記述されたコードは、コンパイラで処理できなくなります。Code written in this way is no longer accepted by the compiler. コンパイラは、PCH ファイルの使用時に #include ディレクティブの不一致を特定できるようにコンパイラの警告 CC4598 を発行するようになりました。The compiler now issues compiler warning CC4598 to help identify mismatched #include directives when using PCH files.

      warning C4598: 'b.h': included header file specified for Ycc.h at position 2 does not match Yuc.h at that position
    

    例 (変更前):Example (before):

    X.cpp (-Ycc.h)X.cpp (-Ycc.h)

      #include "a.h"
      #include "b.h"
      #include "c.h"
    

    Z.cpp (-Yuc.h)Z.cpp (-Yuc.h)

      #include "b.h"
      #include "a.h"  // mismatched order relative to X.cpp
      #include "c.h"
    

    例 (変更後)Example (after)

    X.cpp (-Ycc.h)X.cpp (-Ycc.h)

      #include "a.h"
      #include "b.h"
      #include "c.h"
    

    Z.cpp (-Yuc.h)Z.cpp (-Yuc.h)

      #include "a.h"
      #include "b.h" // matched order relative to X.cpp
      #include "c.h"
    
  • プリコンパイル済みヘッダー (PCH) ファイルと一致しない #include ディレクトリ (/Wall /WX にのみ影響)Precompiled header (PCH) files and mismatched include directories (only affects /Wall /WX)

    プリコンパイル済みヘッダー (PCH) ファイルの使用時に、以前のバージョンのコンパイラは、コンパイラ -Yc-Yu のコンパイルで一致しない include ディレクトリ (-I) コマンド ライン引数を受け入れていました。Previous versions of the compiler accepted mismatched include directory (-I) command line arguments to the compiler between -Yc and -Yu compilations when using precompiled header (PCH) files. この方法で記述されたコードは、コンパイラで処理できなくなります。Code written in this way is no longer accepted by the compiler. コンパイラは、PCH ファイルの使用時に include ディレクトリ (-I) コマンド ライン引数を特定できるコンパイラの警告 CC4599 を発行するようになりました。The compiler now issues compiler warning CC4599 to help identify mismatched include directory (-I) command line arguments when using PCH files.

      warning C4599: '-I..' : specified for Ycc.h at position 1 does not match Yuc.h at that position
    

    例 (変更前)Example (before)

      cl /c /Wall /Ycc.h -I.. X.cpp
      cl /c /Wall /Yuc.h Z.cpp
    

    例 (変更後)Example (after)

      cl /c /Wall /Ycc.h -I.. X.cpp
      cl /c /Wall /Yuc.h -I.. Z.cpp
    

Visual Studio 2013 での C++ の新機能What's New for C++ in Visual Studio 2013

ISO C/C++ 標準のサポートの強化Improved ISO C/C++ Standards Support

コンパイラCompiler

MSVC では次の ISO C++11 の言語機能がサポートされています。MSVC supports these ISO C++11 language features:

  • 関数テンプレートに関する既定のテンプレート引数。Default template arguments for function templates.
  • コンストラクターのデリゲートDelegating constructors
  • 明示的な変換演算子。Explicit conversion operators.
  • 初期化子リストと均一な初期化。Initializer lists and uniform initialization.
  • 未加工の文字列リテラル。Raw string literals.
  • 可変値引数テンプレート。Variadic templates.
  • エイリアスのテンプレート。Alias templates.
  • 削除指定関数。Deleted functions.
  • 非静的データ メンバーの初期化子 (NSDMI)Non-static data member initializers (NSDMIs).
  • 既定化関数。Defaulted functions. **
  • サポートされる ISO C99 機能:Supports these ISO C99 language features:
  • _Bool_Bool
  • 複合リテラル。Compound literals.
  • 初期化子の指定。Designated initializers.
  • コードによる宣言の混合。Mixing declarations with code.
  • 文字列リテラルから変更可能な値への変換は、新しいコンパイラ オプション /Zc:strictStrings を使用して無効にすることができます。String literal conversion to modifiable values can be disallowed by using the new compiler option /Zc:strictStrings. C++ 98 では、文字列リテラルから char* (およびワイド文字列リテラル) への変換 wchar_t* は非推奨とされました。In C++98, conversion from string literals to char* (and wide string literals to wchar_t*) was deprecated. C++11 では、変換は完全に削除されました。In C++11, the conversion was removed entirely. コンパイラを標準に厳密に準拠させることもできますが、そうではなく、変換を制御できるように /Zc:strictStrings のオプションが用意されています。Although the compiler could strictly conform to the standard, instead it provides the /Zc:strictStrings option so that you can control conversion. 既定では、このオプションはオフです。By default, the option is off. デバッグ モードでこのオプションを使用すると、STL はコンパイルされません。Note that when you are using this option in debug mode, the STL will not compile.
  • rvalue/lvalue の参照キャスト。rvalue/lvalue Reference Casts. C++11 では、右辺値参照を使用して、左辺値と右辺値を明確に区別できます。With rvalue references, C++11 can clearly distinguish between lvalues and rvalues. 以前は、コンパイラは、具体的なキャストのシナリオでこれを実現できませんでした。Previously, the compiler did not provide this in specific casting scenarios. 新しいコンパイラ オプションである /Zc:rvalueCast が追加され、コンパイラが C++ Language Working Paper (C++ 言語報告書) (セクション 5.4 [expr.cast]/1 を参照) に準拠するようになりました。A new compiler option, /Zc:rvalueCast, has been added to make the compiler conformant with the C++ Language Working Paper(see section 5.4, [expr.cast]/1). このオプションを指定しない場合の既定の動作は、Visual Studio 2012 の動作と同じです。The default behavior when this option is not specified is the same as in Visual Studio 2012.

注意

既定化関数では、=default を使用したメンバー関数の移動コンストラクターと移動代入演算子の要求はサポートされていません。For defaulted functions, using =default to request memberwise move constructors and move assignment operators is not supported.

C99 ライブラリC99 Libraries

複数のヘッダーで、不足していた関数の宣言と実装が追加されます (math.h、ctype.h、wctype.h、stdio.h、stdlib.h、wchar.h)。Declarations and implementations are added for missing functions in these headers: math.h, ctype.h, wctype.h, stdio.h, stdlib.h, and wchar.h. また新しいヘッダーとして complex.h、stdbool.h、fenv.h、inttypes.h が追加され、これらのヘッダーで宣言されたすべての関数が実装されます。Also added are the new headers complex.h, stdbool.h, fenv.h, and inttypes.h, and implementations for all the functions declared in them. 新しい C++ のラッパー ヘッダー (ccomplex、cfenv、cinttypes、ctgmath) が追加され、複数のヘッダーが更新されます (ccomplex、cctype、clocale、cmath、cstdint、cstdio、cstring、cwchar、cwctype)。There are new C++ wrapper headers (ccomplex, cfenv, cinttypes, ctgmath) and a number of others are updated (ccomplex, cctype, clocale, cmath, cstdint, cstdio, cstring, cwchar, and cwctype).

標準テンプレート ライブラリStandard Template Library

C++11 の明示的な変換演算子、初期化子リスト、スコープ指定の列挙型、および可変個引数テンプレートがサポートされています。Support for the C++11 explicit conversion operators, initializer lists, scoped enums, and variadic templates. すべてのコンテナーは、C++11 の詳細な要素要件をサポートするようになりました。All containers now support the C++11 fine-grained element requirements. 次の C++14 機能のサポート。Support for these C++14 features:

  • "透過的な演算子のファンクター" less<>、greater<>、plus<>、multiplies<> など。"Transparent operator functors" less<>, greater<>, plus<>, multiplies<>, and so on.
  • make_unique<T>(args...)、make_unique<T[]>(n)make_unique<T>(args...) and make_unique<T[]>(n)
  • cbegin()/cend()、rbegin()/rend()、crbegin()/crend() の各非メンバー関数。cbegin()/cend(), rbegin()/rend(), and crbegin()/crend() non-member functions.
  • <atomic> 多数のパフォーマンスの向上を受けました。<atomic> received numerous performance enhancements.
  • <type_traits> 主要な安定化とコード修正を受け取りました。<type_traits> received major stabilization and code fixes.

重大な変更Breaking Changes

この ISO C/C++ 標準のサポート強化に伴って、既存のコードに変更を加える必要が生じる可能性があります。その結果、コードは C++11 に準拠し、Visual Studio 2013 の Visual C++ で正しくコンパイルできるようになります。This improved support for ISO C/C++ standards may require changes to existing code so that it conforms to C++11 and compiles correctly in Visual C++ in Visual Studio 2013.

Visual C++ ライブラリの強化Visual C++ Library Enhancements

  • C++ REST SDK を追加しました。C++ REST SDK is added. この中には、REST サービスに関する C++ の最新の実装があります。It has a modern C++ implementation of REST services.
  • C++ AMP テクスチャのサポートが強化されました。C++ AMP Texture support is enhanced. この中には、ミップマップと新しいサンプリング モードのサポートが含まれます。It now includes support for mipmaps and new sampling modes.
  • PPL タスクは複数のスケジューリング テクノロジおよび非同期デバッグをサポートします。PPL tasks support multiple scheduling technologies and asynchronous debugging. 新しい API により、通常の結果と例外条件の両方を対象とする PPL タスクを作成できます。New APIs enable the creation of PPL tasks for both normal results and exception conditions.

C++ アプリケーションのパフォーマンスC++ Application Performance

  • 自動ベクター化は、より多くの C++ のパターンを認識および最適化し、コードをいっそう高速に実行できるようになりました。Auto-Vectorizer now recognizes and optimizes more C++ patterns to make your code run faster.
  • ARM プラットフォームと Atom マイクロアーキテクチャ コードの品質が向上しました。ARM platform and Atom micro-architecture code quality improvements.
  • 呼び出し規約 __vectorcall が追加されました。__vectorcall calling convention is added. ベクター レジスタを使用するための呼び出し規約 __vectorcall を使用して、ベクター型の引数を渡します。Pass vector type arguments by using the __vectorcall calling convention to use vector registers.
  • 新しいリンカー オプション。New Linker Options. /Gw (コンパイラ) と /Gy (アセンブラー) スイッチにより、より効率的なバイナリを生成するためのリンカー最適化が有効になります。The /Gw (compiler) and /Gy (assembler) switches enable linker optimizations to produce leaner binaries.
  • C++ AMP の共有メモリのサポート。これにより、CPU と GPU との間でのデータ コピーが減少するか、不要になります。C++ AMP shared memory support to reduce or eliminate data copying between CPU and GPU.

ガイド付き最適化のプロファイル (Profile Guided Optimization、PGO) が次のように強化されましたProfile Guided Optimization (PGO) enhancements

  • PGO を使用して最適化されたアプリケーションのワーキング セットの縮小を通じてパフォーマンスを向上させました。Performance improvements from a reduction in the working set of apps that are optimized by using PGO.
  • Windows ランタイム アプリ開発用の新しい PGO。New PGO for Windows Runtime app development.

Windows ランタイム アプリ開発のサポートWindows Runtime App Development Support

  • Value 構造体の中でのボックス化された値のサポート。Support For Boxed Types In Value structs.

    たとえば、ではなく null にできるフィールドを使用して、値型を定義できるようになりました IBox<int>^ intYou can now define value types by using fields that can be null—for example, IBox<int>^ as opposed to int. これは、フィールドが値を持つか、と等しい場合があることを意味 nullptr します。This means that the fields can either have a value, or be equal to nullptr.

  • よりリッチな例外情報。Richer Exception Information.

    C++/CX は新しい Windows エラー モデルをサポートし、アプリケーション バイナリ インターフェイス (ABI) を通じたリッチな例外情報の伝達とキャプチャを可能にします。その中には、呼び出し履歴とカスタム メッセージ文字列が含まれます。C++/CX supports the new Windows error model that enables the capture and propagation of rich exception information across the application binary interface (ABI); this includes call stacks and custom message strings.

  • Object::ToString () は仮想メソッドになりました。Object::ToString() Is Now Virtual.

    ユーザー定義の Windows ランタイムの参照型の中で、ToString をオーバーライドできるようになりました。You can now override ToString in user-defined Windows Runtime ref types.

  • 非推奨の API のサポート。Support For Deprecated APIs.

    Public Windows ランタイム API は、"非推奨" というマークを付けられ、ビルドの警告として表示されるカスタム メッセージを付与され、移行のガイドラインが提供されるようになりました。Public Windows Runtime APIs can now be marked as deprecated and given a custom message that appears as a build warning and can provide migration guidance.

  • デバッガーの強化。Debugger Improvements.

    ネイティブ/JavaScript ネの相互運用機能デバッグ、Windows ランタイムの例外診断、非同期コードのデバッグ (Windows ランタイムと PPL の両方) をサポートします。Support for native/JavaScript interop debugging, Windows Runtime exception diagnosis, and async code debugging (both Windows Runtime and PPL).

注意

ここで説明する C++ 固有の機能と拡張機能に加えて、Visual Studio 内の他の拡張機能も、より適切な Windows ランタイム アプリの開発に役立ちます。In addition to the C++-specific features and enhancements that are described in this section, other enhancements in Visual Studio also can help you write better Windows Runtime apps.

診断の強化Diagnostics Enhancements

  • デバッガーの強化。Debugger Improvements. 非同期デバッグとマイ コードのみのデバッグのサポート。Support for async debugging and Just My Code debugging.
  • コード分析カテゴリ。Code Analysis Categories. これで、コード アナライザーからの出力を分類して表示し、コードの欠陥を検出して修正することができます。You can now view categorized output from the Code Analyzer to help you find and fix code defects.
  • XAML 診断。XAML Diagnostics. XAML 内での UI の応答性やバッテリ使用の問題を診断できるようになりました。You can now diagnose UI-responsiveness and battery-usage issues in your XAML.
  • グラフィックスと GPU のデバッグの強化。Graphics and GPU Debugging Improvements.
  • 実際のデバイス上でのリモート キャプチャと再生。Remote capture and playback on real devices.
  • AMP C++ と CPU の同時デバッグ。Simultaneous C++ AMP and CPU debugging.
  • C++ AMP ランタイム診断の強化。Improved C++ AMP runtime diagnostics.
  • HLSL 計算シェーダー トレースのデバッグ。HLSL Compute shader trace debugging.

3-D グラフィックスの強化3-D Graphics Enhancements

  • イメージ コンテンツ パイプラインによる、プリマルチプライされたアルファ DDS 形式のサポート。Image Content Pipeline support for pre-multiplied alpha DDS format.
  • イメージ エディターは、内部でプリマルチプライされたアルファを使用してレンダリングを行い、その結果、濃いにじみのようなレンダリングの副産物を回避できます。Image Editor uses internally pre-multiplied alpha for rendering, and thereby avoids rendering artifacts such as dark halos.
  • イメージ エディターとモデル エディター。Image and Model Editors. イメージ エディターとモデル エディターのシェーダー デザイナー モードで、ユーザー定義フィルターの作成がサポートされるようになりました。User-defined filter creation is now supported in Shader Designer in Image Editor and Model Editor.

IDE と生産性IDE and Productivity

強化されたコード形式Improved Code Formatting. C++ コードに、さらに多くの書式設定を適用できます。You can apply more formatting settings to your C++ code. これらの設定を使用することにより、中かっことキーワードに関連する改行位置、インデント、スペース入力、および行の折り返しを制御できます。By using these settings, you can control new-line placement of braces and keywords, indentation, spacing, and line wrapping. ステートメントとブロックを完了させたとき、およびファイルにコードを貼り付けたときに、コードが自動的に書式設定されます。Code is automatically formatted when you complete statements and blocks, and when you paste code into a file.

中かっこの補完。Brace Completion. C++ コードで、これらの開始文字に対応する終了文字が自動補完されるようになりました。C++ code now auto-completes the closing characters that correspond to these opening characters:

  • { (中かっこ){ (curly brace)
  • [ (角かっこ)[ (square bracket)
  • ( (かっこ)( (parentheses)
  • ' (単一引用符)' (single quote)
  • " (二重引用符)" (double quote)

追加の C++ オート コンプリート機能。Additional C++ Auto-completion Features.

  • クラス型を表すセミコロンを追加します。Adds semicolon for class types.
  • 未加工リテラル文字列のかっこを補完します。Completes parentheses for raw string literals.
  • 複数行のコメントを補完します (/ * * /)Completes multi-line comments (/* */)

[すべての参照の検索] は、一致するテキストの一覧を表示した後、参照の解決とフィルター処理をバックグラウンドで自動的に実行するようになりました。Find All References now automatically resolves and filters references in the background after it displays the list of textual matches.

コンテキスト ベースのメンバー一覧のフィルター処理。Context-Based Member List Filtering. アクセス不可能なメンバーは、IntelliSense のメンバー一覧から除外されます。Inaccessible members are filtered out of the IntelliSense member lists. たとえば、プライベート メンバーは、型を実装するコードを変更しない限り、メンバー一覧の中に表示されません。For example, private members are not displayed in the member list unless you are modifying the code that implements the type. メンバーリストが開いている間、 CtrlJ キーを押して + Jフィルター処理の1レベルを削除できます (現在のメンバーリストウィンドウにのみ適用されます)。While the member list is open, you can press Ctrl+J to remove one level of filtering (applies only to the current member list window). Ctrl + Jキーをもう一度押すと、テキストのフィルター処理が解除され、すべてのメンバーが表示されます。You can press Ctrl+J again to remove the textual filtering and show every member.

パラメーター ヘルプのスクロール。Parameter Help Scrolling. 任意のシグネチャを表示するだけの動作や、現在のコンテキストに基づいてシグネチャを更新しない動作以外に、パラメーター ヘルプのツールヒントの中に表示される関数シグネチャが、実際に入力したパラメーターの数に基づいて変化するようになりました。The displayed function signature in the parameter-help tooltip now changes based on the number of parameters you've actually typed, rather than just showing an arbitrary signature and not updating it based on the current context. パラメーター ヘルプの表示が、入れ子になった関数に対しても正しく機能するようになりました。Parameter help also functions correctly when it's displayed on nested functions.

ヘッダーの切り替え/コード ファイルToggle Header/Code File. ショートカット メニューのコマンドまたはキーボード ショートカットを使用して、ヘッダー ファイルとそれに対応するコード ファイルの間で切り替えを実行できるようになりました。You can now toggle between a header and its corresponding code file by using a command on the shortcut menu, or a keyboard shortcut.

サイズ変更可能な C++ プロジェクトのプロパティ ウィンドウResizable C++ Project Properties Window

C++/CX および C++/CLI 内でのイベント ハンドラー コードの自動生成。Auto-generation of Event Handler Code in C++/CX and C++/CLI. C ++/CX または C++/CLI コード ファイル内で、イベント ハンドラーを追加するためにコードを入力しているときに、エディターでデリゲート インスタンスとイベント ハンドラー定義を自動的に生成できます。When you are typing code to add an event handler in a C++/CX or C++/CLI code file, the editor can automatically generate the delegate instance and event-handler definition. イベント ハンドラー コードが自動生成できる場合に、ツールヒント ウィンドウが表示されます。A tooltip window appears when event-handler code can be auto-generated.

DPI 対応の拡張。DPI Awareness Enhancement. アプリケーション マニフェスト ファイルに対する DPI 対応設定は、[モニターごとの高い DPI 認識] をサポートするようになりました。The DPI Awareness setting for application manifest files now supports the "Per Monitor High DPI Aware" setting.

構成の高速切り替え。Faster Configuration Switching. 大規模なアプリケーションでは、構成の切り替え、特に後続の切り替え操作がより迅速に実行されるようになりました。For large applications, switching configurations—especially subsequent switching operations—execute much more quickly.

ビルド時間の効率。Build Time Efficiency. 多数の最適化と、マルチコアの活用により、特に大規模プロジェクトで、ビルドがさらに高速になりました。Numerous optimizations and multi-core utilization make builds faster, especially for large projects. C++ の WinMD を参照している C++ アプリケーションのインクリメンタル ビルドも非常に高速になりました。Incremental builds for C++ applications that have references to C++ WinMD are also much faster.

Visual Studio 2012 での C++ の新機能What's New for C++ in Visual Studio 2012

C++11 標準のサポートの向上Improved C++11 Standards Support

標準テンプレート ライブラリStandard Template Library

  • 新しい STL ヘッダーのサポート:、、、、、、、 <atomic> <chrono> <condition_variable> <filesystem> <future> <mutex> <ratio> および <thread> 。Support for new STL headers: <atomic>, <chrono>, <condition_variable>, <filesystem>, <future>, <mutex>, <ratio>, and <thread>.
  • メモリ リソースの使用率を最適化するため、コンテナーが以前より小さくなりました。To optimize memory resource usage, containers are now smaller. たとえば、既定の設定の x86 リリース モードの場合、std::vector は Visual Studio 2010 での 16 バイトから Visual Studio 2012 では 12 バイトに、std::map は Visual Studio 2010 での 16 バイトから Visual Studio 2012 では 8 バイトに、それぞれ小さくなりました。For example, in x86 release mode with default settings, std::vector has shrunk from 16 bytes in Visual Studio 2010 to 12 bytes in Visual Studio 2012, and std::map has shrunk from 16 bytes in Visual Studio 2010 to 8 bytes in Visual Studio 2012.
  • C++11 標準に従って、必須ではなく許容として SCARY 反復子が実装されました。As permitted but not required by the C++11 Standard, SCARY iterators have been implemented.

C++11 に関する他の機能強化Other C++11 Enhancements

  • 範囲ベースの for ループ。Range-based for loops. for (for 範囲宣言 : 式) の形式で配列、STL コンテナー、Windows ランタイムのコレクションに対して使用できる、より信頼性の高いループを記述できます。You can write more robust loops that work with arrays, STL containers, and Windows Runtime collections in the form for ( for-range-declaration : expression ). これは、コア言語サポートの一部です。This is part of the Core Language support.

  • ステートレスのラムダとは空のラムダ導入子 [] で始まるコード ブロックで、ローカル変数をキャプチャしません。標準 C++11 で必須要件とされたことから、ステートレスのラムダから関数ポインターへの暗黙的な変換ができるようになりました。Stateless lambdas, which are blocks of code that begin with an empty lambda introducer [] and capture no local variables, are now implicitly convertible to function pointers as required by the C++11 Standard.

  • スコープ付きの列挙型のサポート。Scoped enumerations support. C++ の enum class 列挙キーがサポートされるようになりました。The C++ enum class enum-key is now supported. 次のコードでは、この列挙キーが以前の enum の動作とどのように異なるかを示します。The following code demonstrates how this enum-key differs from previous enum behavior.

    enum class Element { Hydrogen, Helium, Lithium, Beryllium };
    void func1(Element e);
    func1(Hydrogen); // error C2065: 'Hydrogen' : undeclared identifier
    func1(Element::Helium); // OK
    

Windows ランタイム アプリ開発のサポートWindows Runtime App Development Support

  • ネイティブな XAML ベースの UI モデルNative XAML-based UI model. Windows ランタイム アプリでは、新しいネイティブな XAML ベースの UI モデルを使用できます。For Windows Runtime apps, you can use the new native XAML-based UI model.
  • コンポーネントの拡張機能を Visual C++ します。Visual C++ Component Extensions. これらの拡張機能は Windows ランタイム アプリの必要な部分である Windows ランタイム オブジェクトの使用を簡略化します。These extensions simplify consumption of Windows Runtime objects, which are a necessary part of Windows Runtime apps. 詳しくは、「Roadmap for Windows Runtime apps using C++」(C++ を使った Windows ランタイム アプリのためのロードマップ) および「Visual C++ language reference (C++/CX)」(Visual C++ の言語リファレンス (C++/CX)) をご覧くださいFor more information, see Roadmap for Windows Runtime apps using C++ and Visual C++ language reference (C++/CX)
  • DirectX ゲームDirectX games. Windows ランタイム アプリに対する DirectX の新しいサポートを使って、魅力的なゲームを作成できます。You can develop engaging games by using the new DirectX support for Windows Runtime apps.
  • XAML/DirectX の相互運用XAML/DirectX interop. XAML と DirectX の両方を使う Windows ランタイム アプリの相互運用が効率よくなりました。Windows Runtime apps that use both XAML and DirectX now interoperate efficiently.
  • Windows ランタイム コンポーネント DLL の開発Windows Runtime Component DLL development. コンポーネント DLL の開発により、Windows ランタイムの環境が拡張可能になります。Component DLL development makes the Windows Runtime environment extensible.

コンパイラとリンカーCompiler and Linker

  • 自動ベクター化Auto-vectorizer. コンパイラはコード内のループを解析し、可能であれば、ベクター レジスタを使用する命令や最新のプロセッサのすべてに存在する命令を出力します。The compiler analyzes loops in your code and, where possible, emits instructions that use the vector registers and instructions that are present in all modern processors. これによりループがより速くなります This makes the loops run faster. (プロセッサの命令はストリーミング SIMD 拡張命令 (SSE) と呼ばれます)。(The processor instructions are known as SSE, for Streaming SIMD Extensions). この最適化は自動的に適用されるため、最適化を有効化または要求する必要はありません。You do not have to enable or request this optimization because it is applied automatically.
  • 自動並行化Auto-parallelizer. コンパイラは、コードのループを分析し、複数のコアまたはプロセッサに計算を広げる命令を生成できます。The compiler can analyze loops in your code and emit instructions that spread the calculations across multiple cores or processors. これにより、ループの実行速度が向上します。This can make the loops run faster. 既定では有効にならないので、この最適化を要求する必要があります。You must request this optimization because it is not enabled by default. 多くの場合、並行化するループの直前のコードに #pragma loop(hint_parallel(N)) を含めると役に立ちます。In many cases, it helps to include a #pragma loop(hint_parallel(N)) in your code immediately before the loops that you want parallelized.
  • 自動ベクター化と自動並行化が連携することで、複数のコアで計算を実行し、各コアのコードでベクター レジスタを使うことができます。The auto-vectorizer and auto-parallelizer can work together so that calculations are spread across multiple cores and the code on each core uses its vector registers.

Visual Studio 2012 Update 1 の新機能New in Visual Studio 2012 Update 1

C++ コードをビルドするときに、Windows XP を対象にします。Target Windows XP when you build your C++ code. Microsoft C++ のコンパイラとライブラリを使って、Windows XP および Windows Server 2003 を対象にすることができます。You can use the Microsoft C++ compiler and libraries to target Windows XP and Windows Server 2003.

並列プログラミングのサポートParallel Programming Support

C++ Accelerated Massive Parallelism (AMP)C++ Accelerated Massive Parallelism (AMP)

C++ AMP は、通常は個々のグラフィックス カードに GPU として存在するデータ並列ハードウェアを活用して、C++ コードの実行を高速化します。C++ AMP accelerates the execution of your C++ code by taking advantage of the data-parallel hardware that's ordinarily present as a GPU on a discrete graphics card. C++ AMP のプログラミング モデルには、多次元配列、インデックス作成、メモリ転送、タイル、数学関数ライブラリが含まれています。The C++ AMP programming model includes multidimensional arrays, indexing, memory transfer, tiling, and a mathematical function library. C++ AMP の言語拡張機能とコンパイラの制限を使うことにより、データが CPU から GPU またはその逆に移動される方法を制御できます。By using C++ AMP language extensions and compiler restrictions, you can control how data is moved from the CPU to the GPU and back.

デバッギング.Debugging. C++ AMP を使って GPU を対象とするアプリのデバッグ エクスペリエンスは、他の C++ アプリのデバッグと同じです。The debugging experience for apps that use C++ AMP to target the GPU is just like debugging for other C++ apps. これには、前述した新しい並列デバッグの追加が含まれます。This includes the new parallel debugging additions that were mentioned earlier.

ルミ.Profiling. C++ AMP および他の Direct3D ベースのプログラミング モデルに基づく GPU アクティビティのプロファイリングがサポートされるようになりました。There is now profiling support for GPU activity that's based on C++ AMP and other Direct3D-based programming models.

全般的な並列プログラミングの機能強化General Parallel Programming Enhancements

マルチコアおよびメニーコア アーキテクチャに移行するハードウェアでは、開発者はシングルコアの上がり続けるクロック速度に依存することはできなくなりました。With hardware moving to multi-core and many-core architectures, developers can no longer rely on ever-increasing clock speeds from single-cores. コンカレンシー ランタイムでの並列プログラミングのサポートにより、開発者はこれらの新しいアーキテクチャを利用できます。The parallel programming support in the Concurrency Runtime enables developers to take advantage of these new architectures. Visual Studio 2010 では、並列パターン ライブラリなどの強力な C++ 並列化ライブラリが、高度なデータフロー パイプラインを表すことによってコンカレンシーを利用するための機能と共に導入されました。In Visual Studio 2010, powerful C++ parallelization libraries such as the Parallel Patterns Library were introduced, together with features to take advantage of concurrency by expressing sophisticated dataflow pipelines. Visual Studio 2012 では、これらのライブラリが、よりよいパフォーマンス、よりきめ細かい制御、開発者が最も必要とする並列パターンの豊富なサポートを提供するように拡張されています。In Visual Studio 2012, these libraries have been extended to provide better performance, more control, and richer support for the parallel patterns that developers need most. 次のような広範な機能が含まれます。The breadth of the offering now includes:

  • 非同期性と継続性をサポートするリッチなタスク ベースのプログラミング モデル。A rich task-based programming model that supports asynchrony and continuations.
  • fork と join の並列実行をサポートする並列アルゴリズム (parallel_for、parallel_for with affinity、parallel_for_each、parallel_sort、parallel_reduce、parallel_transform)。Parallel Algorithms, which support fork-join parallelism (parallel_for, parallel_for with affinity, parallel_for_each, parallel_sort, parallel_reduce, parallel_transform).
  • priority_queue、queue、vector、map などの std データ構造のスレッドセーフ バージョンを提供するコンカレンシー セーフなコンテナー。Concurrency-safe containers, which provide thread-safe versions of std data structures such as priority_queue, queue, vector, and map.
  • 必然的に同時実行の単位に分解するデータフロー パイプラインを表すために開発者が使用できる非同期エージェント ライブラリ。The Asynchronous Agents Library, which developers can use to express dataflow pipelines that naturally decompose into concurrent units.
  • この一覧内のパターンの円滑な構成を容易にするカスタマイズ可能なスケジューラおよびリソース マネージャー。A customizable scheduler and resource manager to facilitate the smooth composition of the patterns in this list.
全般的な並列デバッグの機能強化General Parallel Debugging Enhancements

[並列タスク] ウィンドウと [並列スタック] ウィンドウに加えて、Visual Studio 2012 では、すべてのスレッドおよびプロセスで式の値を調べて、結果の並べ替えとフィルター処理を実行できる、新しい [並列ウォッチ] ウィンドウが提供されています。In addition to the Parallel Tasks window and Parallel Stacks window, Visual Studio 2012 offers a new Parallel Watch window so that you can examine the values of an expression across all threads and processes, and perform sorting and filtering on the result. また、独自のビジュアライザーを使ってウィンドウを拡張したり、すべてのツール ウィンドウで新しいマルチプロセスのサポートを利用したりすることもできます。You can also use your own visualizers to extend the window, and you can take advantage of the new multi-process support across all tool windows.

IDEIDE

Visual Studio テンプレートのサポート。Visual Studio Templates support. Visual Studio テンプレート テクノロジを使って、C++ プロジェクトや項目テンプレートを作成できます。You can now use the Visual Studio Templates technology to author C++ project and item templates.

ソリューションの非同期読み込み。Asynchronous Solution Load. ソリューションの重要な部分を最初にしてプロジェクトが非同期的に読み込まれるようになり、作業を速く開始できます。Projects are now loaded asynchronously—the key parts of the solution first—so that you can start working faster.

リモート デバッグの自動配置。Automated deployment for remote debugging. Visual C++ でのリモート デバッグ用のファイルの配置が簡素化されています。Deployment of files for remote debugging in Visual C++ has been simplified. プロジェクト コンテキスト メニューの [配置] オプションは、デバッグ構成プロパティで指定されているファイルをリモート コンピューターに自動的にコピーします。The Deploy option on the project context menu automatically copies to the remote computer the files that are specified in the debugging configuration properties. リモート コンピューターにファイルを手動でコピーする必要はなくなりました。Copying files manually to the remote computer is no longer required.

C++/CLI の IntelliSense。C++/CLI IntelliSense. C++/CLI で IntelliSense が完全にサポートされるようになりました。C++/CLI now has full IntelliSense support. クイック ヒント、パラメーター ヘルプ、メンバーの一覧、オート コンプリートなどの IntelliSense の機能が、C++/CLI で動作するようになりました。IntelliSense features such as Quick Info, Parameter Help, List Members, and Auto Completion now work for C++/CLI. さらに、このドキュメントで説明されている IntelliSense および IDE の他の拡張機能も、C++/CLI で動作します。In addition, the other IntelliSense and IDE enhancements listed in this document also work for C++/CLI.

高度な IntelliSense ツールヒント。Richer IntelliSense Tooltips. C++ IntelliSense のクイック ツールヒントで、より詳細な XML ドキュメント コメント スタイルの情報が表示されるようになりました。C++ IntelliSense Quick Info tooltips now show richer XML documentation comments style information. XML ドキュメント コメントのある C++ AMP などのライブラリから API を使っている場合、IntelliSense のツールヒントに単なる宣言以上の情報が表示されます。If you are using an API from a library—for example, C++ AMP—that has XML documentation comments, then the IntelliSense tooltip shows more information than just the declaration. また、コードに XML ドキュメント コメントがある場合、IntelliSense のツールヒントは詳細な情報を表示します。Also, if your code has the XML documentation comments, IntelliSense tooltips will show the richer information.

C++ コードの構築。C++ Code Constructs. [メンバーの一覧] ドロップダウン リストでは、スイッチ、if-else、for ループ、その他の基本的なコード構造のスケルトン コードを利用できます。Skeleton code is available for switch, if-else, for loop, and other basic code constructs, in the List Members drop-down list. 一覧からコードの断片を選択し、コードに挿入して、必要なロジックを入力します。Select a piece of code from the list to insert it into your code and then fill in the required logic. 独自のカスタム コードを作成してエディターで使うこともできます。You can also create your own custom pieces of code for use in the editor.

[メンバーの一覧] の機能強化。List Members Enhancements. コード エディターにコードを入力すると、[メンバーの一覧] ドロップダウン リストが自動的に表示されます。The List Members drop-down list appears automatically as you type code into the code editor. 結果はフィルター処理されるので、入力に合わせて関連するメンバーだけが表示されます。Results are filtered, so that only relevant members are displayed as you type. [オプション] ダイアログ ボックスの [テキスト エディター] > [C/C++] > [詳細設定] で、[メンバーの一覧] で使われるフィルター処理のロジックの種類を制御できます。You can control the kind of filtering logic that's used by the Member List—in the Options dialog box under Text Editor > C/C++ > Advanced.

セマンティック色付け。Semantic Colorization. 型、列挙、マクロ、その他の C++ トークンが、既定で色づけされるようになりました。Types, enumerations, macros, and other C++ tokens now have colorization by default.

参照の強調表示。Reference Highlighting. シンボルを選ぶと、現在のファイル内にあるそのシンボルのすべてのインスタンスが強調表示されます。Selecting a symbol now highlights all instances of the symbol in the current file. 強調Ctrl表示され + Shift + Up Arrow Ctrl + Shift + た参照間を移動するには、ctrl shift ↑キーまたは ctrl shiftキーを押します。Press Ctrl+Shift+Up Arrow or Ctrl+Shift+Down Arrow to move among the highlighted references. [オプション] ダイアログ ボックスの [テキスト エディター] > [C/C++] > [詳細設定] で、この機能をオフにできます。You can turn this feature off in the Options dialog box, under Text Editor > C/C++ > Advanced.

アプリケーション ライフサイクル管理ツールApplication Lifecycle Management Tools

スタティック コード分析Static Code Analysis

C++ のスタティック分析が、より詳細なエラー コンテキスト情報、より多くの分析ルール、よりよい分析結果を提供するように更新されました。Static analysis for C++ has been updated to provide richer error context information, more analysis rules, and better analysis results. 新しい [コード分析] ウィンドウでは、キーワード、プロジェクト、重大度によってメッセージをフィルター処理できます。In the new Code Analysis window, you can filter messages by keyword, project, and severity. ウィンドウでメッセージを選ぶと、そのメッセージがトリガーされたコード行がコード エディターで強調表示されます。When you select a message in the window, the line in the code where the message was triggered is highlighted in the code editor. C++ の特定の警告に対するメッセージでは、警告の原因になった実行パスを示すソース行が一覧表示されます。その特定のパスを取得することになった判断ポイントと理由が強調表示されます。For certain C++ warnings, the message lists source lines that show the execution path that leads to the warning; decision points and the reasons for taking that specific path are highlighted. コード分析は、Visual Studio 2012 のほとんどのエディションに付属しています。Code analysis is included in most editions of Visual Studio 2012. Professional、Premium、Ultimate エディションには、すべてのルールが含まれます。In the Professional, Premium, and Ultimate editions, all rules are included. Windows 8 および Windows Phone 用の Express エディションには、最も重大な警告だけが含まれています。In the Express editions for Windows 8 and Windows Phone, just the most critical warnings are included. Web 用の Express エディションにはコード分析は含まれません。Code analysis is not included in the Express edition for Web. コード分析では他に次のような機能強化が行われています。Here are some other code analysis enhancements:

  • 新しいコンカレンシーの警告は、マルチスレッド C/C++ プログラムで正しいロック規範を使っていることを確認することにより、コンカレンシーのバグの回避に役立ちます。New concurrency warnings help you avoid concurrency bugs by making sure that you are using the correct locking disciplines in multithreaded C/C++ programs. アナライザーは、潜在的な競合状態、ロック順序の逆転、呼び出し元/呼び出し先のロック コントラクト違反、一致しない同期操作、その他のコンカレンシーのバグを検出します。The analyzer detects potential race conditions, lock order inversions, caller/callee locking contract violations, mismatched synchronization operations, and other concurrency bugs.
  • 規則セットを使うことにより、コード分析の実行に適用する C++ の規則を指定できます。You can specify the C++ rules that you want to apply to code analysis runs by using rule sets.
  • [コード分析] ウィンドウでは、選んだ警告を抑制するプラグマをソース コードに挿入できます。In the Code Analysis window, you can insert into the source code a pragma that suppresses a selected warning.
  • Microsoft ソース コード注釈言語 (SAL) の新しいバージョンを使って、関数がパラメーターを使う方法、関数がパラメーターについて行う想定、終了するときに行う保証を記述することにより、スタティック コード分析の精度と完全性を高めることができます。You can enhance the accuracy and completeness of static code analysis by using the new version of the Microsoft source-code annotation language (SAL) to describe how a function uses its parameters, the assumptions that it makes about them, and the guarantees that it makes when it finishes.
  • 64 ビット C++ プロジェクトのサポート。Support for 64bit C++ projects.

更新された単体テスト フレームワークUpdated Unit Test Framework

Visual Studio の新しい C++ 単体テスト フレームワークを使って、C++ の単体テストを記述します。Use the new C++ unit test framework in Visual Studio to write C++ unit tests. [新しいプロジェクト] ダイアログ ボックスの Visual C++ カテゴリで C++ 単体テスト プロジェクト テンプレートを探して、新しい単体テスト プロジェクトを既存の C++ ソリューションに追加します。Add a new unit test project to your existing C++ solution by locating the C++ Unit Test Project template under the Visual C++ category in the New Project dialog box. Unittest1.cpp ファイルに生成された TEST_METHOD コード スタブに、単体テストを記述します。Start writing your unit tests in the generated TEST_METHOD code stub in the Unittest1.cpp file. テスト コードを記述したら、ソリューションをビルドします。When the test code is written, build the solution. テストを実行するときは、[表示] > [その他のウィンドウ] > [単体テスト エクスプローラー] を選んで [単体テスト エクスプローラー] ウィンドウを開いた後、目的のテスト ケースのショートカット メニューで [選択したテストの実行] を選びます。When you want to run the tests, open a Unit Test Explorer window by choosing View > Other Windows > Unit Test Explorer, and then, on the shortcut menu for the test case you want, choose Run selected test. テストの実行が終了した後は、テスト結果と追加のスタック トレース情報を同じウィンドウに表示することができます。After the test run finishes, you can view test results and additional stack trace information in the same window.

アーキテクチャの依存関係グラフArchitecture Dependency Graphs

コードをより深く理解するため、ソリューションのバイナリ、クラス、名前空間、インクルード ファイルの依存関係グラフを生成できるようになりました。To understand your code better, you can now generate dependency graphs for the binary, class, namespace, and include files in a solution. メニューバーで、[アーキテクチャ] [ > 依存関係グラフの生成] の順に選択し、[ソリューション] または [インクルードファイル] で依存関係グラフを生成します。On the menu bar, choose Architecture > Generate Dependency Graph, and then For Solution or For Include File to generate a dependency graph. グラフの生成が完了すると、各ノードを展開して調査し、ノード間を移動して依存関係を理解し、ノードのショートカット メニューの [コンテンツの表示] を選んでソース コードを参照することができます。When the graph generation is complete, you can explore it by expanding each node, learn dependency relationships by moving between nodes, and browse source code by choosing View Content on the shortcut menu for a node. インクルード ファイルの依存関係グラフを生成するには、*.cpp ソース コード ファイルまたは *.h ヘッダー ファイルのショートカット メニューで、[インクルード ファイルのグラフを生成] を選びます。To generate a dependency graph for include files, on the shortcut menu for a *.cpp source code file or *.h header file, choose Generate Graph of Include Files.

アーキテクチャ エクスプローラーArchitecture Explorer

アーキテクチャ エクスプローラーを使うと、C++ のソリューション、プロジェクト、またはファイル内のアセットを調べることができます。By using the Architecture Explorer, you can explore the assets in your C++ solution, projects, or files. メニューバーで、[アーキテクチャ] [ > Windows > アーキテクチャエクスプローラー] の順に選択します。On the menu bar, choose Architecture > Windows > Architecture Explorer. 関心があるノードを選びます ([クラス ビュー] など)。You can select a node you are interested in, for example, Class View. この場合、ツール ウィンドウの右側に名前空間の一覧が展開されます。In this case, the right side of the tool window is expanded with a list of namespaces. 名前空間を選ぶと、新しい列にその名前空間のクラス、構造体、列挙型の一覧が表示されます。If you select a namespace, a new column shows a list of the classes, structs, and enums in this namespace. これらのアセットの調査を続けることも、左端の列に戻って別のクエリを始めることもできます。You can continue to explore these assets, or go back to the column on the far left to start another query. アーキテクチャ エクスプローラーを使用したコードの検索」をご覧ください。See Find Code with Architecture Explorer.

コード カバレッジCode Coverage

実行時にバイナリを動的にインストルメント化するように、コード カバレッジが更新されました。Code coverage has been updated to dynamically instrument binaries at runtime. これにより、構成のオーバーヘッドが減り、パフォーマンスが向上します。This lowers the configuration overhead and provides better performance. また、C++ アプリの単体テストからコード カバレッジ データを収集することもできます。You can also collect code-coverage data from unit tests for C++ apps. C++ の単体テストを作成してある場合は、単体テスト エクスプローラーを使ってソリューション内のテストを検出できます。When you have created C++ unit tests, you can use Unit Test Explorer to discover tests in your solution. 単体テストを実行し、そのコード カバレッジ データを収集するには、単体テスト エクスプローラー[コード カバレッジの分析] を選びます。To run the unit tests and collect code coverage data for them, in Unit Test Explorer, choose Analyze Code Coverage. [コード カバレッジの結果] ウィンドウでコード カバレッジの結果を調べることができます。メニュー バーで、[テスト] > [Windows] > [コード カバレッジの結果] を選びます。You can examine the code coverage results in the Code Coverage Results window—on the menu bar, choose Test > Windows > Code Coverage Results.

Visual Studio 2010 での C++ の新機能What's New for C++ in Visual Studio 2010

C++ のコンパイラとリンカーC++ Compiler and Linker

auto キーワード。auto Keyword. キーワードには auto 新しい目的があります。The auto keyword has a new purpose. キーワードの既定の意味を使用して、 auto 変数の宣言で初期化式から推測される型を持つ変数を宣言します。Use the default meaning of the auto keyword to declare a variable whose type is deduced from the initialization expression in the declaration of the variable. /Zc:autoコンパイラオプションは、キーワードの新しいまたは以前の意味を呼び出し auto ます。The /Zc:auto compiler option invokes either the new or the previous meaning of the auto keyword.

decltype 型指定子。decltype Type Specifier. decltype 型指定子は、指定された式の型を返します。The decltype type specifier returns the type of a specified expression. decltype 型指定子をキーワードと組み合わせて使用して、 auto 複雑な型、またはコンパイラのみで認識されている型を宣言します。Use the decltype type specifier in combination with the auto keyword to declare a type that is either complex or known only to the compiler. たとえば、この組み合わせを使って、テンプレート引数の型に応じた戻り値の型を持つテンプレート関数を宣言します。For example, use the combination to declare a template function whose return type depends on the types of its template arguments. または、別の関数を呼び出し、呼び出した関数の戻り値の型を返すテンプレート関数を宣言できます。Or, declare a template function that calls another function, and then returns the return type of the called function.

ラムダ式。Lambda Expressions. ラムダ関数には、関数本体があるだけで名前はありません。Lambda functions have a function body but no name. ラムダ関数は、関数ポインターと関数オブジェクトの最も良い部分を組み合わせています。Lambda functions combine the best characteristics of function pointers and function objects. ラムダ関数は、それ自体が関数オブジェクトではなくテンプレート関数パラメーターとして使用するか、キーワードと共に使用して、 auto 型がラムダである変数を宣言します。Use a lambda function by itself, as a template function parameter instead of a function object, or together with the auto keyword to declare a variable whose type is a lambda.

rvalue 参照。Rvalue Reference. rvalue 参照宣言子 (&&) では、rvalue への参照を宣言します。The rvalue reference declarator (&&) declares a reference to an rvalue. rvalue 参照を使うと、移動セマンティクスおよび完全転送を使って、より効率的なコンストラクター、関数、テンプレートを記述できます。An rvalue reference lets you use move semantics and perfect forwarding to write more efficient constructors, functions, and templates.

static_assert 宣言。static_assert Declaration. static_assert 宣言は、コンパイル時にソフトウェアのアサーションをテストします。実行時にテストされる他のアサーションメカニズムとは異なります。A static_assert declaration tests a software assertion at compile time, unlike other assertion mechanisms that test at run time. アサーションが失敗した場合は、コンパイルはエラーになり、指定されたエラー メッセージが発行されます。If the assertion fails, the compilation fails and a specified error message is issued.

nullptr キーワードと __nullptr キーワード。nullptr and __nullptr Keywords. MSVC を使用すると、 nullptr ネイティブコードまたはマネージコードでキーワードを使用できます。MSVC lets you use the nullptr keyword with native code or with managed code. キーワードは、 nullptr オブジェクトハンドル、内部ポインター、またはネイティブポインター型がオブジェクトを指していないことを示します。The nullptr keyword indicates that an object handle, interior pointer, or native pointer type does not point to an object. コンパイラオプションを使用すると、コンパイラはマネージコードとしてを解釈し、 nullptr /clr オプションを使用しない場合はネイティブコードとして解釈し /clr ます。The compiler interprets nullptr to be managed code when you use the /clr compiler option, and native code when you do not use the /clr option. Microsoft 固有の __nullptr キーワードはと同じ意味を持ち nullptr ますが、ネイティブコードにのみ適用されます。The Microsoft-specific __nullptr keyword has the same meaning as nullptr, but it applies to native code only. コンパイラオプションを使用してネイティブ C/c + + コードをコンパイルした場合、 /clr コンパイラは、 nullptr キーワードがネイティブなのかマネージ語であるかを判断できません。If you compile native C/C++ code by using the /clr compiler option, the compiler cannot determine whether the nullptr keyword is a native or a managed term. コンパイラに意図を明確に伝えるため、マネージド コードを指定するには nullptr キーワードを使い、ネイティブ コードを指定するには __nullptr キーワードを使います。To make your intention clear to the compiler, use the nullptr keyword to specify the managed term, and __nullptr to specify the native term.

/Zc:trigraphs コンパイラオプション。/Zc:trigraphs Compiler Option. 既定では、トライグラフのサポートは無効です。By default, support for trigraphs is disabled. トライグラフの /Zc:trigraphs サポートを有効にするには、コンパイラオプションを使用します。Use the /Zc:trigraphs compiler option to enable trigraphs support. トライグラフは、2 つの連続する疑問符 (??) と、一意の 3 番目の文字で構成されます。A trigraph consists of two consecutive question marks (??) followed by a unique third character. コンパイラはトライグラフを対応する区切り文字に置き換えます。The compiler replaces a trigraph with the corresponding punctuation character. たとえば、コンパイラは ??= というトライグラフを # 文字 (シャープ記号) で置き換えます。For example, the compiler replaces the ??= trigraph with the # (number sign) character. トライグラフは、特定の区切り文字を含まない文字セットを使う C ソース ファイルで使います。Use trigraphs in C source files that use a character set that does not contain certain punctuation characters.

新しいガイド付き最適化のプロファイル オプション。New Profile-Guided Optimization Option. PogoSafeMode はガイド付き最適化のプロファイルの新しいオプションであり、アプリケーションを最適化するときに、セーフ モードと高速モードのどちらにするかを指定できます。PogoSafeMode is a new profile-guided optimization option that lets you specify whether to use safe mode or fast mode when you optimize your application. セーフ モードはスレッド セーフですが、高速モードより低速になります。Safe mode is thread-safe, but it is slower than fast mode. 高速モードが既定の動作です。Fast mode is the default behavior.

新しい共通言語ランタイム (CLR) オプション /clr:nostdlib。New Common Language Runtime (CLR) Option /clr:nostdlib. /clr (共通言語ランタイムのコンパイル) 用に新しいオプションが追加されました。A new option is added for /clr (Common Language Runtime Compilation). 同じライブラリの異なるバージョンが含まれている場合は、コンパイル エラーが発生します。If different versions of the same libraries are included, a compile error is issued. 新しいオプションでは、指定したバージョンをプログラムで使用できるように、既定の CLR ライブラリを除外できます。The new option lets you exclude the default CLR libraries so that your program can use a specified version.

新しいプラグマ ディレクティブ detect_mistmatch。New pragma directive detect_mismatch. プラグマ ディレクティブ detect_mismatch により、同じ名前の他のタグと比較されるタグをファイルに配置できます。The pragma directive detect_mismatch lets you put a tag in your files that is compared to other tags that have the same name. 同じ名前の複数の値がある場合、リンカーはエラーを生成します。If there are multiple values for the same name, the linker issues an error.

XOP 組み込み、FMA4 組み込み、LWP 組み込み。XOP Intrinsics, FMA4 Intrinsics, and LWP Intrinsics. Visual Studio 2010 SP1 用に追加された XOP 組み込み 、Visual Studio 2010 SP1 用に追加された FMA4 組み込み、Visual Studio 2010 SP1 プロセッサ技術用に追加された LWP 組み込みをサポートするために、新しい組み込み関数が追加されました。New intrinsic functions have been added to support the XOP Intrinsics Added for Visual Studio 2010 SP1, FMA4 Intrinsics Added for Visual Studio 2010 SP1, and LWP Intrinsics Added for Visual Studio 2010 SP1 processor technologies. __cpuid、__cpuidex を使うと、特定のコンピューターにどのコプロセッサ技術がサポートされるかを確認できます。Use __cpuid, __cpuidex to determine which processor technologies are supported on a particular computer.

Visual Studio C++ プロジェクトとビルド システムVisual Studio C++ projects and the Build System

MSBuild.MSBuild. Visual C++ ソリューションおよびプロジェクトは、VCBuild.exe に代わる MSBuild.exe を使ってビルドするようになりました。Visual C++ solutions and projects are now built by using MSBuild.exe, which replaces VCBuild.exe. MSBuild は、柔軟で拡張性のある XML ベースのビルド ツールであり、他の Visual Studio 言語やプロジェクトの種類でも使われます。MSBuild is the same flexible, extensible, XML-based build tool that is used by the other Visual Studio languages and project types. この変更により、Visual Studio C++ プロジェクト ファイルは XML ファイル形式になり、ファイル名拡張子は .vcxproj になります。Because of this change, Visual Studio C++ project files now use an XML file format and have the .vcxproj file name extension. 以前のバージョンの Visual Studio からの Visual Studio C++ プロジェクト ファイルは、新しいファイル形式に自動的に変換されます。Visual Studio C++ project files from earlier versions of Visual Studio are automatically converted to the new file format.

VC++ ディレクトリ。VC++ Directories. VC++ ディレクトリの設定が、2 つの場所になりました。The VC++ directories setting is now located in two places. VC++ ディレクトリのプロジェクトごとの値を設定するには、プロジェクトのプロパティ ページを使います。Use project property pages to set per-project values for VC++ directories. VC++ ディレクトリの、グローバルな構成ごとの値を設定するには、プロパティ マネージャーおよびプロパティ シートを使います。Use the Property Manager and a property sheet to set global, per-configuration values for VC++ directories.

プロジェクト間の依存関係。Project-to-Project Dependencies. 以前のリリースでは、定義されたプロジェクト間の依存関係はソリューション ファイルに格納されていました。In earlier releases, defined dependencies between projects were stored in the solution file. これらのソリューションが新しいプロジェクト ファイル形式に変換されると、依存関係は、プロジェクト間参照に変換されます。When these solutions are converted to the new project file format, dependencies are converted to project-to-project references. ソリューションの依存関係の概念とプロジェクト間参照の概念は異なるため、この変更によってアプリケーションに影響が生じることがあります。This change can affect applications because the concepts of solution dependencies and project-to-project references are different.

マクロと環境変数。Macros and Environment Variables. 新しい _ITERATOR_DEBUG_LEVEL マクロは、反復子に対するデバッグのサポートを呼び出します。The new _ITERATOR_DEBUG_LEVEL macro invokes debugging support for iterators. このマクロは、以前の _SECURE_SCL マクロおよび _HAS_ITERATOR_DEBUGGING マクロの代わりに使います。Use this macro instead of the older _SECURE_SCL and _HAS_ITERATOR_DEBUGGING macros.

Visual C++ のライブラリVisual C++ Libraries

コンカレンシー ランタイム ライブラリ。Concurrency Runtime Libraries. コンカレンシー ランタイム フレームワークは、同時に実行されるアプリケーションやコンポーネントをサポートし、Visual C++ でコンカレンシーアプリケーションをプログラミングするためのフレームワークとなっています。The Concurrency Runtime framework supports applications and components that run simultaneously, and is the framework for programming concurrent applications in Visual C++. 並列パターン ライブラリ (PPL) では、同時実行アプリケーション プログラミングをサポートするために、粒度の細かい並列化を実行するための汎用目的コンテナーおよびアルゴリズムが用意されています。To support concurrent-application programming, the Parallel Patterns Library (PPL) provides general-purpose containers and algorithms for performing fine-grained parallelism. 非同期エージェント ライブラリは、アクターベースのプログラミング モデルと、粒度の粗いデータ フローおよびパイプライン処理タスクのメッセージ パッシング インターフェイスの役割も果たします。The Asynchronous Agents Library provides an actor-based programming model and message passing interfaces for coarse-grained dataflow and pipelining tasks.

標準 C++ ライブラリ。Standard C++ Library. 次のリストは、標準 C++ ライブラリに対して行われた変更の一部を示しています。The following list describes many of the changes that have been made to the Standard C++ Library.

  • 新しい rvalue 参照 C++ 言語機能は、標準テンプレート ライブラリの多くの関数で移動セマンティクスおよび完全転送を実装するために使われています。The new rvalue reference C++ language feature has been used to implement move semantics and perfect forwarding for many functions in the Standard Template Library. 移動セマンティクスと完全転送は、変数またはパラメーターの割り当て操作のパフォーマンスを大幅に向上させます。Move semantics and perfect forwarding greatly improve the performance of operations that allocate or assign variables or parameters.
  • rvalue 参照はまた、新しい unique_ptr クラスを実装するためにも使用されています。これは auto_ptr クラスより安全なスマート ポインター型です。Rvalue references are also used to implement the new unique_ptr class, which is a safer smart pointer type than the auto_ptr class. unique_ptr クラスは、移動可能ですがコピー可能ではなく、安全性に影響を及ぼさずに厳密な所有権セマンティクスを実装し、rvalue 参照を認識するコンテナーに適しています。The unique_ptr class is movable but not copyable, implements strict ownership semantics without affecting safety, and works well with containers that are aware of rvalue references. auto_ptr クラスの使用は非推奨とされます。The auto_ptr class is deprecated.
  • 、、など、15個の新しい関数 find_if_not copy_if is_sorted がヘッダーに追加されました <algorithm> 。Fifteen new functions, for example, find_if_not, copy_if, and is_sorted, have been added to the <algorithm> header.
  • ヘッダーで <memory> は、新しい make_shared 関数は、オブジェクトの構築時にオブジェクトへの共有ポインターを作成するための便利で信頼性の高い効率的な方法です。In the <memory> header, the new make_shared function is a convenient, robust, and efficient way to make a shared pointer to an object at the same time the object is constructed.
  • シングルリンクリストは、ヘッダーによってサポートされてい <forward_list> ます。Singly linked lists are supported by the <forward_list> header.
  • 新しい cbegincendcrbegincrend の各メンバー関数には、コンテナーで前方または後方に移動する const_iterator が用意されています。The new cbegin, cend, crbegin, and crend member functions provide a const_iterator that moves forward or backward through a container.
  • <system_error>ヘッダーと関連テンプレートは、低レベルのシステムエラーの処理をサポートしています。The <system_error> header and related templates support the processing of low-level system errors. exception_ptr クラスのメンバーは、スレッド間で例外を転送するために使うことができます。Members of the exception_ptr class can be used to transport exceptions between threads.
  • ヘッダーは、 <codecvt> Unicode 文字のさまざまなエンコードを他のエンコーディングに変換することをサポートしています。The <codecvt> header supports converting various encodings of Unicode characters to other encodings.
  • ヘッダーには、 <allocators> ノードベースのコンテナーのメモリブロックの割り当てと解放に役立ついくつかのテンプレートが定義されています。The <allocators> header defines several templates that help allocate and free memory blocks for node-based containers.
  • ヘッダーには多くの更新があり <random> ます。There are numerous updates to the <random> header.

Microsoft Foundation Class (MFC) ライブラリMicrosoft Foundation Class (MFC) Library

Windows 7 の機能。Windows 7 Features. MFC は Windows 7 の多くの機能をサポートしています。たとえば、リボン ユーザー インターフェイス (UI)、タスク バー、ジャンプ リスト、タブ化されたサムネイル、サムネイルのプレビュー、プログレス バー、アイコン オーバーレイ、検索インデックス作成などがあります。MFC supports many Windows 7 features, for example, the Ribbon user interface (UI), the Taskbar, jump lists, tabbed thumbnails, thumbnail previews, the progress bar, icon overlay, and search indexing. MFC は Windows 7 の多くの機能を自動的にサポートしているため、既存のアプリケーションを変更する必要がない場合があります。Because MFC automatically supports many Windows 7 features, you may not have to modify your existing application. 新しいアプリケーションで他の機能をサポートするには、MFC アプリケーション ウィザードを使って、使う機能を指定します。To support other features in new applications, use the MFC Application Wizard to specify the functionality you want to use.

マルチタッチ認識。Multi-touch Awareness. MFC はマルチタッチ ユーザー インターフェイスを持つアプリケーションをサポートしています。これには、Microsoft Surface オペレーティング システム用に書かれたアプリケーションが含まれます。MFC supports applications that have a multi-touch user interface, for example, applications that are written for the Microsoft Surface operating system. マルチタッチ アプリケーションは、Windows のタッチ メッセージおよびタッチ メッセージの組み合わせであるジェスチャ メッセージを処理できます。A multi-touch application can handle Windows touch messages and gesture messages, which are combinations of touch messages. タッチおよびジェスチャのイベントを扱うようアプリケーションを登録しておくと、オペレーティング システムがマルチタッチ イベントをイベント ハンドラーにルーティングします。Just register your application for touch and gesture events and the operating system will route multi-touch events to your event handlers.

高 DPI の認識。High-DPI Awareness. MFC アプリケーションは、既定で高 DPI 認識になりました。By default, MFC applications are now High-DPI-aware. アプリケーションが高 DPI (High Dots Per Inch) 認識の場合、オペレーティング システムでは、ウィンドウ、テキスト、その他の UI 要素を現在の画面の解像度にスケーリングできます。If an application is High-DPI (high dots per inch) aware, the operating system can scale windows, text, and other UI elements to the current screen resolution. つまり、スケーリングされたイメージは正しいレイアウトで表示され、切り取られたり粗くなったりすることはありません。This means that a scaled image is more likely to be correctly laid out, and not clipped or pixelated.

再起動マネージャー。Restart Manager. 再起動マネージャーは、アプリケーションが予期せず終了または再起動した場合に、ドキュメントを自動的に保存してアプリケーションを再起動します。The restart manager automatically saves documents and restarts your application if it unexpectedly closes or restarts. たとえば、自動更新によってアプリケーションが終了した後に、再起動マネージャーを使ってアプリケーションを起動できます。For example, you can use the restart manager to start your application after it is closed by an automatic update. 再起動マネージャーを使うためのアプリケーションの構成方法について詳しくは、「方法: 再起動マネージャーのサポートを追加する」をご覧ください。For more information about how to configure your application to use the restart manager, see How to: Add Restart Manager Support.

CTaskDialog.CTaskDialog. CTaskDialog クラスは、標準の AfxMessageBox の代わりに使用できます。The CTaskDialog class can be used instead of the standard AfxMessageBox message box. CTaskDialog クラスでは、標準のメッセージ ボックスよりも多くの情報を表示して収集できます。The CTaskDialog class displays and gathers more information than the standard message box does.

SafeInt ライブラリSafeInt Library

新しい SafeInt ライブラリは、整数のオーバーフローの原因となる算術演算を安全に実行します。The new SafeInt Library performs safe arithmetic operations that account for integer overflow. このライブラリは、異なる種類の整数も比較します。This library also compares different kinds of integers.

新しい ATL (Active Template Library) マクロNew Active Template Library (ATL) macros

新しいマクロが ATL に追加され、PROP_ENTRY_TYPE および PROP_ENTRY_TYPE_EX の機能が拡張されました。New macros have been added to ATL to expand the functionality of PROP_ENTRY_TYPE and PROP_ENTRY_TYPE_EX. PROP_ENTRY_INTERFACE および PROP_ENTRY_INTERFACE_EX では、有効な CLSID のリストを追加できます。PROP_ENTRY_INTERFACE and PROP_ENTRY_INTERFACE_EX let you add a list of valid CLSIDs. PROP_ENTRY_INTERFACE_CALLBACK および PROP_ENTRY_INTERFACE_CALLBACK_EX では、コールバック関数を指定して、CLSID が有効かどうかを判断できます。PROP_ENTRY_INTERFACE_CALLBACK and PROP_ENTRY_INTERFACE_CALLBACK_EX let you specify a callback function to determine whether a CLSID is valid.

/analyze の警告/analyze Warnings

ほとんどの /analyze (エンタープライズコード分析) 警告は、C ランタイム (CRT)、MFC、および ATL ライブラリから削除されました。Most /analyze (Enterprise Code Analysis) warnings have been removed from the C Run-Time (CRT), MFC, and ATL libraries.

アニメーションおよび D2D のサポートAnimation and D2D support

MFC でアニメーションと Direct2D グラフィックスがサポートされるようになりました。MFC now supports animation and Direct2D graphics. MFC ライブラリには、この機能をサポートするための複数の新しい MFC クラスと関数があります。The MFC library has several new MFC classes and functions to support this functionality. また、2 つの新しいチュートリアルで、D2D オブジェクトおよびアニメーション オブジェクトをプロジェクトに追加する方法が説明されています。There are also two new walkthroughs to show how to add a D2D object and an animation object to a project. このチュートリアルは、「チュートリアル: MFC プロジェクトへの D2D オブジェクトの追加」と「チュートリアル: MFC プロジェクトへのアニメーションの追加」です。These walkthroughs are Walkthrough: Adding a D2D Object to an MFC Project and Walkthrough: Adding Animation to an MFC Project.

IDEIDE

強化された IntelliSense。Improved IntelliSense. Visual C++ の IntelliSense の設計が刷新され、スピードと正確さが増し、より大きいプロジェクトを処理できるようになりました。IntelliSense for Visual C++ has been completely redesigned to be faster, more accurate, and able to handle larger projects. IDE はこれを実現するために、開発者がソース コードを表示して変更する方法と、IDE がソリューションを構築するためにソース コードとプロジェクト設定を使う方法を使い分けています。To achieve this improvement, the IDE makes a distinction between how a developer views and modifies source code, and how the IDE uses source code and project settings to build a solution. この役割分担のおかげで、クラス ビューや新しい [移動] ダイアログ ボックスなどの参照機能は、以前のコンパイルされないブラウザー (.ncb) ファイルに代わる新しい SQL Server デスクトップ データベース (.sdf) ファイルに基づいたシステムによって処理されます。Because of this separation of duties, browsing features such as Class View and the new Navigate To dialog box are handled by a system that is based on a new SQL Server desktop database (.sdf) file that replaces the old no compile browse (.ncb) file. クイック ヒント、オート コンプリート、パラメーター ヘルプなどの IntelliSense 機能は、必要な場合にのみ翻訳単位を解析します。IntelliSense features such as Quick Information, Auto Completion, and Parameter Help parse translation units only when required. 新しい [呼び出し階層] ウィンドウなどのハイブリッド機能は、参照機能と IntelliSense 機能の組み合わせを使います。Hybrid features such as the new Call Hierarchy window use a combination of the browse and IntelliSense features. IntelliSense はその時点で必要な情報のみを処理するため、IDE の反応はより迅速です。Because IntelliSense processes only the information that you require at the moment, the IDE is more responsive. また、より新しい情報を使うため、IDE のビューとウィンドウもさらに正確です。Also, because information is more up to date, IDE views and windows are more accurate. 最後に、IDE インフラストラクチャの組織、機能、スケーラビリティが優れているため、より大きなプロジェクトを処理できます。Finally, because the IDE infrastructure is better organized, more capable, and more scalable, it can handle larger projects.

強化された IntelliSense エラー。Improved IntelliSense Errors. IDE では、IntelliSense の障害を引き起こす可能性があるエラーの検出機能が強化され、エラーには赤色の波線が表示されます。The IDE better detects errors that could cause a loss of IntelliSense and displays red wavy underlines under them. また、IDE により IntelliSense エラーが [エラー一覧] ウィンドウにレポートされます。In addition, the IDE reports IntelliSense errors to the Error List Window. 問題の原因となっているコードを表示するには、[エラー一覧] ウィンドウでエラーをダブルクリックします。To display the code that is causing the problem, double-click the error in the Error List Window.

#include オートコンプリート機能。#include Auto-Complete Feature. IDE では、#include キーワードのオートコンプリートがサポートされます。The IDE supports auto-completion for the #include keyword. #include」と入力すると、IDE によって有効なヘッダー ファイルのドロップダウン リスト ボックスが作成されます。When you type #include, the IDE creates a drop-down list box of valid header files. ファイル名の入力を続けると、入力内容に基づいてリストが IDE によりフィルター処理されます。If you continue by typing a file name, the IDE filters the list based on your entry. 含めるファイルはリストからいつでも選択できます。At any point, you can select from the list the file you want to include. これにより、正確なファイル名を知らなくても、ファイルを簡単に含めることができます。This lets you quickly include files without knowing the exact file name.

に移動します。Navigate To. [移動] ダイアログ ボックスでは、指定した文字列と一致するすべてのシンボルやファイルをプロジェクト内で検索できます。The Navigate To dialog box lets you search for all symbols and files in your project that match a specified string. 検索文字列に追加の文字を入力していくと、検索結果が瞬時に更新されます。Search results are immediately revised as you type additional characters in your search string. [結果] フィードバック フィールドでは、見つかった項目の数が表示され、検索を絞り込む必要性を判断するのに役立ちます。The Results feedback field tells you the number of items found and helps you decide whether to constrain your search. [種類/スコープ][位置]、および [プレビュー] の各フィードバック フィールドは、似た名前の項目を識別するのに役立ちます。The Kind/Scope, Location, and Preview feedback fields help you disambiguate items that have similar names. また、この機能を拡張して、他のプログラミング言語をサポートすることもできます。In addition, you can extend this feature to support other programming languages.

並列デバッグとプロファイリング。Parallel Debugging and Profiling. Visual Studio デバッガーはコンカレンシー ランタイムを認識し、並列処理アプリケーションのトラブルシューティングに役立ちます。The Visual Studio debugger is aware of the Concurrency Runtime and helps you troubleshoot parallel processing applications. 新しいコンカレンシープロファイラー ツールを使って、アプリケーションの全体的な動作を視覚化できます。You can use the new concurrency profiler tool to visualize the overall behavior of your application. さらに、新しいツール ウィンドウを使って、タスクの状態とその呼び出し履歴も視覚化できます。Also, you can use new tool windows to visualize the state of tasks and their call stacks.

リボンデザイナー。Ribbon Designer. リボン デザイナーとは、MFC リボン UI の作成と変更を行うためのグラフィカル エディターです。The Ribbon Designer is a graphical editor that lets you create and modify an MFC ribbon UI. 最終的なリボン UI は、XML ベースのリソース ファイル (.mfcribbon-ms) によって表されます。The final ribbon UI is represented by an XML-based resource file (.mfcribbon-ms). 既存のアプリケーションの場合、何行かのコードを一時的に追加し、リボン デザイナーを呼び出すことによって、現在のリボン UI を取り込むことができます。For existing applications, you can capture your current ribbon UI by temporarily adding a few lines of code and then invoking the Ribbon Designer. リボン リソース ファイルが作成された後、手書きのリボン UI コードを、リボン リソースを読み込む少数のステートメントに置き換えることができます。After the ribbon resource file is created, you can replace your handwritten ribbon UI code with a few statements that load the ribbon resource.

呼び出し階層。Call Hierarchy. [呼び出し階層] ウィンドウでは、特定の関数によって呼び出されるすべての関数、または特定の関数を呼び出すすべての関数に移動できます。The Call Hierarchy window lets you navigate to all functions that are called by a particular function, or to all functions that call a particular function.

ツールTools

MFC クラスウィザード。MFC Class Wizard. Visual C++ 2010 では、評価の高かった MFC クラス ウィザード ツールが復活しています。Visual C++ 2010 brings back the well-regarded MFC Class Wizard tool. MFC クラス ウィザードを使うと、ソース ファイルのセットを手作業で変更せずに、クラス、メッセージ、変数を簡単にプロジェクトに追加できます。The MFC Class Wizard is a convenient way to add classes, messages, and variables to a project without having to manually modify sets of source files.

ATL コントロールウィザード。ATL Control Wizard. ATL コントロール ウィザードでは、ProgID フィールドが自動的に設定されなくなりました。The ATL Control Wizard no longer automatically populates the ProgID field. ATL コントロールに ProgID がない場合、他のツールを使用できないことがあります。If an ATL control does not have a ProgID, other tools may not work with it. コントロールに ProgID があることを必要とするツールの例としては、[Active コントロールの挿入] ダイアログ ボックスがあります。One example of a tool that requires controls to have a ProgID is the Insert Active Control dialog box. ダイアログボックスの詳細については、「 ActiveX コントロールの挿入」を参照してください。For more information about the dialog box, see Insert ActiveX controls.

Microsoft Macro Assembler リファレンスMicrosoft Macro Assembler Reference

YMMWORD データ型の追加では、Intel Advanced Vector Extensions (AVX) 命令に含まれている、256 ビットのマルチメディア オペランドがサポートされます。The addition of the YMMWORD data type supports the 256-bit multimedia operands that are included in the Intel Advanced Vector Extensions (AVX) instructions.

Visual Studio 2008 での C++ の新機能What's New for C++ in Visual Studio 2008

Visual C++ 統合開発環境 (IDE: Integrated Development Environment)Visual C++ Integrated Development Environment (IDE)

  • ATL、MFC、Win32 の各アプリケーション内に作成されたダイアログ ボックスが、Windows Vista スタイル ガイドラインに準拠するようになりました。Dialog boxes that are created in ATL, MFC, and Win32 applications now comply with the Windows Vista style guidelines. Visual Studio 2008 を使って新しいプロジェクトを作成すると、アプリケーション内に挿入したダイアログ ボックスはすべて、Windows Vista スタイル ガイドラインに準拠します。When you create a new project by using Visual Studio 2008, all dialog boxes that you insert into your application will comply with the Windows Vista style guideline. 旧バージョンの Visual Studio で作成したプロジェクトを再コンパイルした場合、既存のダイアログ ボックスは以前と同じ外観になります。If you recompile a project that you created with an earlier version of Visual Studio, any existing dialog boxes will maintain the same look that they previously had. アプリケーションにダイアログ ボックスを挿入する方法について詳しくは、「ダイアログ エディター」をご覧ください。For more information about how to insert dialog boxes into your application, see Dialog Editor.

  • ATL プロジェクト ウィザードに、すべてのユーザーについてコンポーネントを登録するオプションが追加されました。The ATL Project wizard now has an option to register components for all users. Visual Studio 2008 以降では、ATL プロジェクト ウィザードで作成された COM コンポーネントとタイプ ライブラリは、[すべてのユーザーについてコンポーネントを登録] を選択した場合を除いて、レジストリの HKEY_CURRENT_USER ノードに登録されます。Beginning with Visual Studio 2008, the COM components and type libraries that are created by the ATL Project wizard are registered in the HKEY_CURRENT_USER node of the registry unless you select Register component for all users.

  • ATL プロジェクト ウィザードから、属性付き ATL プロジェクトを作成するオプションがなくなりました。The ATL Project wizard no longer provides an option to create attributed ATL projects. Visual Studio 2008 以降の ATL プロジェクト ウィザードには、新しいプロジェクトの属性付きステータスを変更するオプションがありません。Beginning with Visual Studio 2008, the ATL Project wizard does not have an option to change the attributed status of a new project. ウィザードで作成される新しい ATL プロジェクトはすべて属性なしになります。All new ATL projects that the wizard creates are now unattributed.

  • レジストリへの書き込みをリダイレクトできるようになりました。Writing to the registry can be redirected. Windows Vista の導入に伴い、レジストリの一部の領域への書き込みの際に、プログラムをシステム特権のあるモードで実行することが必要になりました。With the introduction of Windows Vista, writing to certain areas of the registry requires a program to run in elevated mode. Visual Studio を常にシステム特権のあるモードで実行することは望ましくありません。It is not desirable to always run Visual Studio in elevated mode. ユーザーごとのリダイレクトにより、プログラミングを変更せずに、レジストリへの書き込みを HKEY_CLASSES_ROOT から HKEY_CURRENT_USER に自動的にリダイレクトできます。Per-user redirection automatically redirects registry writes from HKEY_CLASSES_ROOT to HKEY_CURRENT_USER without any programming changes.

  • クラス デザイナーで、ネイティブ C++ コードが限定的にサポートされるようになりました。The Class Designer now has limited support for native C++ code. 以前のバージョンの Visual Studio では、クラス デザイナーは Visual C# と Visual Basic でしか使用できませんでした。In earlier versions of Visual Studio, the Class Designer worked only with Visual C# and Visual Basic. C++ ユーザーも、読み取り専用モードだけですが、クラス デザイナーを使うことができるようになりました。C++ users can now use the Class Designer, but only in read-only mode. C++ でクラス デザイナーを使う方法について詳しくは、「クラス デザイナーにおける Visual C++ コードの使用」をご覧ください。For more information about how to use the Class Designer with C++, see Working with Visual C++ Code in Class Designer.

  • プロジェクト ウィザードに、C++ SQL Server プロジェクトを作成するオプションがなくなりました。The project wizard no longer has an option to create a C++ SQL Server project. Visual Studio 2008 以降、新しいプロジェクト ウィザードでは C++ SQL Server プロジェクトを作成するオプションがなくなりました。Beginning with Visual Studio 2008, the new project wizard does not have an option to create a C++ SQL Server project. 以前のバージョンの Visual Studio を使用して作成した SQL Server プロジェクトは、今後も適切にコンパイルされ、動作します。SQL Server projects created by using an earlier version of Visual Studio will still compile and work correctly.

Visual C++ のライブラリVisual C++ Libraries

全般General

  • アプリケーションを特定のバージョンの Visual C++ ライブラリにバインドできるようになりました。Applications can be bound to specific versions of the Visual C++ libraries. アプリケーションが、Visual C++ ライブラリのリリース後に行われた更新に依存している場合があります。Sometimes an application depends on updates that were made to the Visual C++ libraries after a release. その場合、以前のバージョンのライブラリが存在するコンピューターでアプリケーションを実行すると、予期しない動作が発生する可能性があります。In this case, running the application on a computer that has earlier versions of the libraries can cause unexpected behavior. 以前のバージョンのライブラリが存在するコンピューターでアプリケーションが実行されないように、アプリケーションを特定バージョンのライブラリにバインドできるようになりました。You can now bind an application to a specific version of the libraries so that it will not run on a computer that has an earlier version of the libraries.

STL/CLR ライブラリSTL/CLR Library

  • Visual C++ に STL/CLR ライブラリが追加されました。Visual C++ now includes the STL/CLR Library. STL/CLR ライブラリは、標準 C++ ライブラリのサブセットである標準テンプレート ライブラリ (STL: Standard Template Library) のパッケージであり、C++ と .NET Framework の共通言語ランタイム (CLR: Common Language Runtime) で使用します。The STL/CLR Library is a packaging of the Standard Template Library (STL), a subset of the Standard C++ Library, for use with C++ and the .NET Framework common language runtime (CLR). STL/CLR を使うと、マネージド環境で STL のすべてのコンテナー、反復子、アルゴリズムを利用できるようになりました。With STL/CLR, you can now use all the containers, iterators, and algorithms of STL in a managed environment.

MFC ライブラリMFC Library

  • Windows Vista でコモン コントロールがサポートされるようになりました。Windows Vista supports Common Controls. Windows Vista の機能のサポートまたは現在の MFC クラスの機能向上のために、18 の新規または既存のクラスに 150 以上のメソッドが追加されました。Over 150 methods in 18 new or existing classes have been added to support features in Windows Vista, or to improve functionality in current MFC classes.
  • 新しい CNetAddressCtrl クラスを使うと、IPv4 アドレス、IPv6 アドレス、または DNS 名を入力して検証できます。The new CNetAddressCtrl class enables you to input and validate IPv4 and IPv6 addresses or DNS names.
  • 新しい CPagerCtrl クラスを使うと、Windows のページャー コントロールを簡単に使うことができます。The new CPagerCtrl class simplifies use of the Windows pager control.
  • また、新しい CSplitButton クラスを使うと、Windows の分割ボタン コントロールを簡単に使って、既定またはオプションのアクションを選択できます。The new CSplitButton class simplifies the use of the Windows splitbutton control to select a default or optional action.

C++ のサポート ライブラリC++ Support Library

  • C++ にマーシャリング ライブラリが導入されました。C++ introduces the marshaling library. マーシャリング ライブラリを使うと、最適化された簡単な方法で、ネイティブ環境とマネージド環境との間でデータのマーシャリングを行うことができます。The marshaling library provides an easy and optimized way to marshal data between native and managed environments. このライブラリは、PInvoke を使用するような、より複雑で非効率的な方法の代わりになります。The library is an alternative to more complex and less efficient approaches such as Using PInvoke. 詳しくは、「C++ におけるマーシャリングの概要」をご覧ください。See Overview of Marshaling in C++ for more information.

ATL ServerATL Server

  • ATL Server が共有ソース プロジェクトとしてリリースされるようになりました。ATL Server is released as a shared source project.
  • ATL サーバーのほとんどのコード ベースは CodePlex 上で共有ソース プロジェクトとしてリリースされており、Visual Studio 2008 の一部としてはインストールされません。Most of the ATL Server code base has been released as a shared source project on CodePlex and is not installed as part of Visual Studio 2008. ATL サーバーに関連する一部のファイルは、Visual Studio に含まれなくなりました。Several files associated with ATL Server are no longer part of Visual Studio. 削除されたファイルの一覧については、「削除された ATL Server ファイル」をご覧ください。For the list of removed files, see Removed ATL Server Files.
  • atlenc.h の関数とユーティリティ関数のデータ エンコード/デコード クラス、および atlutil.h と atlpath.h のクラスが ATL ライブラリに追加されました。Data encoding and decoding classes from atlenc.h and utility functions and classes from atlutil.h and atlpath.h are now part of the ATL library.
  • Microsoft は、以前のリリースの Visual Studio に含まれていたバージョンの ATL Server を、そのバージョンの Visual Studio がサポートされている間は引き続きサポートします。Microsoft will continue to support versions of ATL Server that are included in earlier releases of Visual Studio as long as those versions of Visual Studio are supported. CodePlex は ATL Server コードの開発をコミュニティ プロジェクトとして続行します。CodePlex will continue development of the ATL Server code as a community project. Microsoft は CodePlex バージョンの ATL Server をサポートしません。Microsoft does not support a CodePlex version of ATL Server.

Visual C++ のコンパイラとリンカーVisual C++ Compiler and Linker

コンパイラに関する変更点Compiler Changes

  • コンパイラでマネージド インクリメンタル ビルドがサポートされるようになりました。The compiler supports managed incremental builds. このオプションを指定した場合、コンパイラは参照アセンブリが変更されたときにコードを再コンパイルしません。When you specify this option, the compiler will not recompile code when a referenced assembly changes. 代わりに、インクリメンタル ビルドを実行します。Instead it will perform an incremental build. ファイルの再コンパイルは、変更が依存コードに影響する場合にのみ実行されます。Files are recompiled only if the changes affect the dependent code.
  • ATL Server 関連の属性はサポートされなくなりました。Attributes related to ATL Server are no longer supported. コンパイラで、ATL Server に直接関連付けられていたいくつかの属性がサポートされなくなりました。The compiler no longer supports several attributes that were directly related to ATL Server. 削除された属性の一覧については、「互換性に影響する変更点」をご覧ください。For a complete list of the removed attributes, see Breaking Changes.
  • コンパイラで Intel Core Microarchitecture がサポートされるようになりました。The compiler supports Intel Core microarchitecture. コンパイラで、コード生成中に Intel Core Microarchitecture 用の調整が行われます。The compiler contains tuning for the Intel Core microarchitecture during code generation. この調整は既定で実行され、Pentium 4 およびその他のプロセッサにも役立つため無効にはできません。By default, this tuning is on and cannot be disabled as it also helps Pentium 4 and other processors.
  • 組み込み命令で AMD および Intel の新しいプロセッサがサポートされるようになりました。Intrinsics support newer AMD and Intel processors. いくつかの新しい組み込み命令で、AMD および Intel の新しいプロセッサの高度な機能がサポートされています。Several new intrinsic instructions support the greater functionality in more recent AMD and Intel processors. 新しい組み込み命令について詳しくは、「Supplemental Streaming SIMD Extensions 3 Instructions」(追加のストリーミング SIMD Extensions 3 命令)、「Streaming SIMD Extensions 4 Instructions」(ストリーミング SIMD Extensions 4 命令)、「SSE4A and Advanced Bit Manipulation Intrinsics」(SSE4A と高度なビット操作命令)、AES 組み込み命令_mm_clmulepi64_si128、__rdtscp をご覧ください。For more information about the new intrinsics, see Supplemental Streaming SIMD Extensions 3 Instructions, Streaming SIMD Extensions 4 Instructions, SSE4A and Advanced Bit Manipulation Intrinsics, AES Intrinsics, _mm_clmulepi64_si128, and __rdtscp.
  • __cpuid 関数が更新されました。The __cpuid function is updated. __cpuid および __cpuidex 関数で、最新バージョンの AMD および Intel のプロセッサの複数の新機能がサポートされるようになりました。The __cpuid, __cpuidex functions now support several new features from the latest revisions of AMD and Intel processors. 新しい __cpuidex 組み込み関数を使うと、最新のプロセッサについてより詳細な情報を収集できます。The __cpuidex intrinsic is new and gathers more information from recent processors.
  • /MP コンパイラ オプションにより、合計ビルド時間が短縮されます。The /MP compiler option reduces total build time. /MP オプションを使うと、ファイルを同時にコンパイルするいくつかのプロセスを作成することにより、複数のソース ファイルをコンパイルする合計時間を大幅に短縮できます。The /MP option can significantly reduce the total time to compile several source files by creating several processes that compile the files simultaneously. このオプションは、ハイパースレッド、複数のプロセッサ、または複数のコアをサポートするコンピューターで特に便利です。This option is especially useful on computers that support hyperthreading, multiple processors, or multiple cores.
  • /Wp64コンパイラオプションと __w64 キーワードは非推奨とされます。The /Wp64 compiler option and __w64 keyword are deprecated. /Wp64 __w64 64 ビット移植性の問題を検出するコンパイラオプションとキーワードは非推奨とされており、コンパイラの将来のバージョンでは削除される予定です。The /Wp64 compiler option and __w64 keyword, which detect 64-bit portability issues, are deprecated and will be removed in a future version of the compiler. このコンパイラ オプションとキーワードの代わりに、64 ビット プラットフォームが対象の MSVC を使用します。Instead of this compiler option and keyword, use a MSVC that targets a 64-bit platform.
  • /Qfast_transcendentals 超越関数のインライン コードを生成します。/Qfast_transcendentals generates inline code for transcendental functions.
  • /Qimprecise_fwaits は、/fp:except コンパイラ オプションの使用時に、try ブロック内部の fwait コマンドを削除します。/Qimprecise_fwaits removes the fwait commands internal to try blocks when you use the /fp:except compiler option.

リンカーに関する変更点Linker Changes

  • Visual C++ リンカー (link.exe) で、実行可能ファイルのマニフェスト ファイルにユーザー アカウント制御情報が組み込まれるようになりました。User Account Control information is now embedded into manifest files for executables by the Visual C++ linker (link.exe). この機能は、既定で有効になっています。This feature is enabled by default. この機能を無効にする方法および既定の動作を変更する方法については、「/MANIFESTUAC (UAC 情報をマニフェストに組み込む)」をご覧ください。For more information about how to disable this feature, or how to modify the default behavior, see /MANIFESTUAC (Embeds UAC information in manifest).
  • Windows Vista の Address Space Layout Randomization 機能を有効にする /DYNAMICBASE オプションがリンカーに追加されました。The linker now has the /DYNAMICBASE option to enable the Address Space Layout Randomization feature of Windows Vista. このオプションは、ロード時にアプリケーションをランダムにリベースするかどうかを示すように実行可能ファイルのヘッダーを変更します。This option modifies the header of an executable to indicate whether the application should be randomly rebased at load time.

Visual Studio 2005 での C++ の新機能What's New for C++ in Visual Studio 2005

Visual C++ 2005 Service Pack 1 での新機能は以下のとおりです。The following features were new in Visual C++ 2005 Service Pack 1:

x86 と x64 用の組み込み関数Intrinsics for x86 and x64

  • __halt__halt
  • __lidt__lidt
  • __nop__nop
  • __readcr8__readcr8
  • __sidt__sidt
  • __svm_clgi__svm_clgi
  • __svm_invlpga__svm_invlpga
  • __svm_skinit__svm_skinit
  • __svm_stgi__svm_stgi
  • __svm_vmload__svm_vmload
  • __svm_vmrun__svm_vmrun
  • __svm_vmsave__svm_vmsave
  • __ud2__ud2
  • __vmx_off__vmx_off
  • __vmx_vmptrst__vmx_vmptrst
  • __writecr8__writecr8

x64 のみ用の組み込み関数Intrinsics for x64 Only

  • __vmx_on__vmx_on
  • __vmx_vmclear__vmx_vmclear
  • __vmx_vmlaunch__vmx_vmlaunch
  • __vmx_vmptrld__vmx_vmptrld
  • __vmx_vmread__vmx_vmread
  • __vmx_vmresume__vmx_vmresume
  • __vmx_vmwrite__vmx_vmwrite

新しい言語キーワードNew Language Keywords

__sptr、__uptr__sptr, __uptr

新しいコンパイラ機能New Compiler Features

このリリースのコンパイラには重大な変更があります。The compiler has breaking changes in this release.

  • 64 ビットのネイティブ コンパイラとクロス コンパイラ。`64-bit native and cross-compilers.
  • /analyze (エンタープライズ コード分析) コンパイラ オプションが追加されました。/analyze (Enterprise Code Analysis) compiler option has been added.
  • /bigobj コンパイラ オプションが追加されました。/bigobj compiler option has been added.
  • /clr:pure/clr:safe/clr:oldSyntax が追加されました。/clr:pure, /clr:safe, and /clr:oldSyntax have been added. (のちに、Visual Studio 2015 で非推奨になり、Visual Studio 2017 で削除されました。)(Later deprecated in Visual Studio 2015 and removed in Visual Studio 2017.)
  • 非推奨のコンパイラ オプション: このリリースでは、多くのコンパイラ オプションが使われなくなりました。詳しくは、「Deprecated Compiler Options」(非推奨のコンパイラ オプション) をご覧ください。Deprecated compiler options: many compiler options have been deprecated in this release; see Deprecated Compiler Options for more information.
  • /clr コードのダブル サンキングが減りました。詳しくは、「ダブル サンキング (C++)」をご覧ください。Double thunking in /clr code is reduced; see Double Thunking (C++) for more information.
  • /EH (例外処理モデル) または /EHs は、スロー以外の手段で発生した例外のキャッチに使用できなくなりました。/EHa を使用してください。/EH (Exception Handling Model) or /EHs can no longer be used to catch an exception that is raised with something other than a throw; use /EHa.
  • /errorReport (内部コンパイラ エラーの報告) コンパイラ オプションが追加されました。/errorReport (Report Internal Compiler Errors) compiler option has been added.
  • /favor (64 用の最適化) コンパイラ オプションが追加されました。/favor (Optimize for 64) compiler option has been added.
  • /FA/Fa (リスティング ファイル) コンパイラ オプションが追加されました。/FA, /Fa (Listing File) compiler option has been added.
  • /FC (診断時のソース コード ファイルの完全パス) コンパイラ オプションが追加されました。/FC (Full Path of Source Code File in Diagnostics) compiler option has been added.
  • /fp (浮動小数点の動作の指定) コンパイラ オプションが追加されました。/fp (Specify Floating-Point Behavior) compiler option has been added.
  • /G (プロセッサの最適化) コンパイラ オプションが追加されました。/G (Optimize for Processor) Options compiler option has been added.
  • /G (プロセッサの最適化) コンパイラ オプションが追加されました。/G (Optimize for Processor) Options compiler option has been added.
  • /G3/G4/G5/G6/G7/GB コンパイラ オプションが削除されました。/G3, /G4, /G5, /G6, /G7, and /GB compiler options have been removed. コンパイラは、すべてのアーキテクチャに対して最適な出力ファイルの作成を試みる "ブレンド モデル" を使うようになりました。The compiler now uses a "blended model" that attempts to create the best output file for all architectures.
  • /Gf は削除されました。/Gf has been removed. 代わりに /GF (同一文字列の削除) を使います。Use /GF (Eliminate Duplicate Strings) instead.
  • /GL (プログラム全体の最適化) が /CLRHEADER と互換性を持つようになりました。/GL (Whole Program Optimization) is now compatible with /CLRHEADER.
  • /GR が既定でオンになるようになりました。/GR is now on by default.
  • /GS (バッファーのセキュリティ チェック) が、脆弱なポインター パラメーターをセキュリティで保護するようになりました。/GS (Buffer Security Check) now provides security protection for vulnerable pointer parameters. /GS が既定でオンになるようになりました。/GS is now on by default. /GS が、/clr (共通言語ランタイムのコンパイル) で MSIL に対してコンパイルされた関数で動作するようになりました。/GS now also works on functions compiled to MSIL with /clr (Common Language Runtime Compilation).
  • /homeparams (レジスタ パラメーターのスタックへのコピー) コンパイラ オプションが追加されました。/homeparams (Copy Register Parameters to Stack) compiler option has been added.
  • /hotpatch (ホットパッチ可能なイメージの作成) コンパイラ オプションが追加されました。/hotpatch (Create Hotpatchable Image) compiler option has been added.
  • インライン関数ヒューリスティックが更新されました。詳細については、「」、「」、 inline __inline __forceinline および inline_depth を参照してください。Inline function heuristics have been updated; see inline, __inline, __forceinline and inline_depth for more information
  • 多くの新しい組み込み関数が追加され、以前はドキュメントに記載されていなかった多くの組み込み関数が記載されるようになりました。Many new intrinsic functions have been added, and many previously undocumented intrinsics are now documented.
  • 既定で、失敗した新規の呼び出しが例外をスローするようになります。By default, any call to new that fails will throw an exception.
  • /ML および /MLd コンパイラ オプションが削除されました。/ML and /MLd compiler options have been removed. Visual C++ は、シングルスレッドの静的にリンクされた CRT ライブラリをサポートしなくなりました。Visual C++ no longer supports single-threaded, statically linked CRT library support.
  • コンパイラは、名前付き戻り値の最適化を実装するようになりました。この機能は、/O1/O2 (サイズの最小化、実行速度の最大化)、/Og (グローバルの最適化)、/Ox (最大限の最適化) を指定してコンパイルすると有効になります。The compiler implemented the Named Return Value Optimization, which is enabled when you compile with /O1, /O2 (Minimize Size, Maximize Speed), /Og (Global Optimizations), and /Ox (Full Optimization).
  • /Oa コンパイラ オプションは削除されましたが、何の警告もなく無視されます。コンパイラのエイリアス方法を指定するには、noalias または restrict__declspec 修飾子を使います。/Oa compiler option has been removed but will be silently ignored; use the noalias or restrict__declspec modifiers to specify how the compiler does aliasing.
  • /Op コンパイラ オプションが削除されました。/Op compiler option had been removed. 代わりに /fp (浮動小数点の動作の指定) を使います。Use /fp (Specify Floating-Point Behavior) instead.
  • OpenMP が Visual C++ でサポートされるようになりました。OpenMP is now supported by Visual C++.
  • /openmp (OpenMP 2.0 サポートの有効化) コンパイラ オプションが追加されました。/openmp (Enable OpenMP 2.0 Support) compiler option has been added.
  • /Ow コンパイラ オプションは削除されましたが、何の警告もなく無視されます。/Ow compiler option has been removed but will be silently ignored. コンパイラのエイリアス方法を指定するには、noalias または restrict__declspec 修飾子を使います。Use the noalias or restrict__declspec modifiers to specify how the compiler does aliasing.

ガイド付き最適化のプロファイルProfile-Guided Optimizations

  • /QI0f は削除されました。/QI0f has been removed.
  • /QIfdiv は削除されました。/QIfdiv has been removed.
  • /QIPF_B (B CPU ステップ実行のエラー) コンパイラ オプションが追加されました。/QIPF_B (Errata for B CPU Stepping) compiler option has been added.
  • /QIPF_C (C CPU ステップ実行のエラー) コンパイラ オプションが追加されました。/QIPF_C (Errata for C CPU Stepping) compiler option has been added.
  • /QIPF_fr32 (上位 96 ビットの浮動小数点レジスタの使用の禁止) コンパイラ オプションが追加されました。/QIPF_fr32 (Do Not Use Upper 96 Floating Point Registers) compiler option has been added.
  • /QIPF_noPIC (位置に依存するコードの生成) コンパイラ オプションが追加されました。/QIPF_noPIC (Generate Position Dependent Code) compiler option has been added.
  • /QIPF_restrict_plabels (実行時に関数が作成されないものと仮定) コンパイラ オプションが追加されました。/QIPF_restrict_plabels (Assume No Functions Created at Run Time) compiler option has been added.

コンパイラおよびリンカーでの Unicode のサポートUnicode Support in the Compiler and Linker

  • /vd (ディスプレイスメントの無効化) で、構築中 (/vd2) のオブジェクトに対して dynamic_cast 演算子を使用できるようになりました/vd (Disable Construction Displacements) now allows you to use dynamic_cast Operator on an object being constructed (/vd2)
  • /YX コンパイラ オプションが削除されました。/YX compiler option has been removed. 代わりに、/Yc (プリコンパイル済みヘッダー ファイルの作成) または /Yu (プリコンパイル済みヘッダー ファイルの使用) を使います。Use /Yc (Create Precompiled Header File) or /Yu (Use Precompiled Header File) instead. ビルド構成から /YX を削除し、代わりに何も指定しないと、ビルドが高速になります。If you remove /YX from your build configurations and replace it with nothing, it can result in faster builds.
  • /Zc:forScope が既定でオンになるようになりました。/Zc:forScope is now on by default.
  • /Zc:wchar_t が既定でオンになるようになりました。/Zc:wchar_t is now on by default.
  • /Zd コンパイラ オプションが削除されました。/Zd compiler option has been removed. 行番号のみのデバッグ情報がサポートされなくなりました。Line-number only debugging information is no longer supported. 代わりに /Zi を使います (詳しくは、「/Z7、/Zi、/ZI (デバッグ情報の形式)」をご覧ください)。Use /Zi instead (see /Z7, /Zi, /ZI (Debug Information Format) for more information).
  • /Zg は C ソース コード ファイルでのみ有効になり、C++ ソース コード ファイルでは有効ではなくなりました。/Zg is now only valid on C source code files, and not on C++ source code files.
  • /Zx (デバッグ最適化された Itanium コード) コンパイラ オプションが追加されました。/Zx (Debug Optimized Itanium Code) compiler option has been added.

新しい言語機能New Language Features

  • attributeattribute は非推奨となりました。The attributeattribute is now deprecated.
  • appdomain__declspec 修飾子が追加されました。appdomain__declspec modifier has been added.
  • __clrcall 呼び出し規則が追加されました。__clrcall calling convention has been added.
  • deprecated (C++) declspec 修飾子を使って、ユーザーが非推奨のクラスまたは関数にアクセスしようとするとコンパイル時に表示される文字列を指定できるようになりました。deprecated (C++) declspec modifier now allows you to specify a string that will be displayed at compile time, when a user tries to access a deprecated class or function.
  • dynamic_cast 演算子に互換性に影響する変更点があります。dynamic_cast Operator has breaking changes.
  • ネイティブ列挙型で、基になる型を指定できるようになりました。Native enums now allow you to specify the underlying type.
  • jitintrinsicdeclspec 修飾子が追加されました。jitintrinsicdeclspec modifier has been added.
  • noaliasdeclspec 修飾子が追加されました。noaliasdeclspec modifier has been added.
  • process__declspec 修飾子が追加されました。process__declspec modifier has been added.
  • abstractoverridesealed がネイティブ コンパイルで有効になりました。abstract, override, and sealed are valid for native compilations.
  • __restrict キーワードが追加されました。__restrict keyword has been added.
  • restrictdeclspec 修飾子が追加されました。restrictdeclspec modifier has been added.
  • __thiscall はキーワードになりました。__thiscall is now a keyword.
  • __unaligned キーワードは現在ドキュメントに記載されています。__unaligned keyword is now documented.
  • volatile (C++) は、最適化に関して動作を更新しました。volatile (C++) has updated behavior with respect to optimizations.

新しいプリプロセッサ機能New Preprocessor Features

  • __CLR_VER 定義済みマクロが追加されました。__CLR_VER predefined macro added.
  • comment (C/C++) プラグマが、リンカー コメントとして /MANIFESTDEPENDENCY を受け付けるようになりました。The comment (C/C++) pragma now accepts /MANIFESTDEPENDENCY as a linker comment. comment に対する exestr オプションが非推奨となりました。The exestr option to comment is now deprecated.
  • embedded_idl 属性 (#import ディレクティブ) がオプションのパラメーターを受け取るようになりました。embedded_idl attribute (The #import Directive) now takes an optional parameter.
  • fenv_access プラグマfenv_access pragma
  • float_control プラグマfloat_control pragma
  • fp_contract プラグマfp_contract pragma
  • グローバル変数がプラグマ マネージド、プラグマ アンマネージド、アンマネージドの各セクションにある場合、グローバル変数は宣言されている順序で初期化されません。Global variables will not be initialized in the order they are declared if you have global variables in pragma managed, unmanaged and unmanaged sections. これは、たとえば、アンマネージド グローバル変数がマネージド グローバル変数で初期化され、完全に構築されたマネージド オブジェクトが必要な場合などに、互換性に影響する変更になる可能性があります。This is a potential breaking change if, for example, an unmanaged global variable is initialized with a managed global variables, and a fully constructed managed object is required.
  • init_seg で指定されたセクションは、以前のバージョンでは読み取り/書き込みでしたが、読み取り専用になりました。Sections specified with init_seg are now read only, and not read/write as in previous versions.
  • inline_depth の既定値が 16 になりました。inline_depth default is now 16. 既定値 16 は、Visual C++ .NET 2003 でも有効でした。A default of 16 was also in effect in Visual C++ .NET 2003.
  • _INTEGRAL_MAX_BITS 定義済みマクロが追加されました。「定義済みマクロ」をご覧ください。_INTEGRAL_MAX_BITS predefined macro added, see Predefined Macros.
  • _M_CEE、_M_CEE_PURE、_M_CEE_SAFE 定義済みマクロが追加されました。「定義済みマクロ」をご覧ください。_M_CEE, _M_CEE_PURE, and _M_CEE_SAFE predefined macros added, see Predefined Macros.
  • _M_IX86_FP 定義済みマクロが追加されました。_M_IX86_FP predefined macro added.
  • _M_X64 定義済みマクロが追加されました。_M_X64 predefined macro added.
  • make_public プラグマmake_public pragma
  • managedunmanaged プラグマの構文が更新されました (pushpop を持つようになりました)managed, unmanaged pragma syntax updated (now has push and pop)
  • mscorlib.dll が、すべての /clr コンパイルの #using ディレクティブによって暗黙的に参照されるようになりました。mscorlib.dll is now implicitly referenced by The #using Directive in all /clr compilations.
  • _OPENMP 定義済みマクロが追加されました。_OPENMP predefined macro added.
  • optimize プラグマが更新され、a と w は有効なパラメーターではなくなりました。optimize pragma has been updated, a and w are no longer valid parameters.
  • no_registry#import 属性が追加されました。no_registry#import attribute has been added.
  • regionendregion プラグマが追加されましたregion, endregion pragmas added
  • _VC_NODEFAULTLIB 定義済みマクロが追加されました。_VC_NODEFAULTLIB predefined macro added.
  • 可変個引数マクロが実装されるようになりました。Variadic Macros are now implemented.
  • vtordisp が非推奨となりました。今後の Visual C++ バージョンからは削除されます。vtordisp is deprecated and will be removed in a future release of Visual C++.
  • warning プラグマに suppress 指定子が追加されました。The warning pragma now has the suppress specifier.

リンカーの新機能New Linker Features

  • モジュール (非アセンブリ MSIL 出力ファイル) が、リンカーへの入力として許可されるようになりました。Modules (non-assembly MSIL output files) are now allowed as input to the linker.
  • /ALLOWISOLATION (マニフェスト検索) リンカー オプションが追加されました。/ALLOWISOLATION (Manifest Lookup) linker option has been added.
  • /ASSEMBLYRESOURCE (マネージド リソースの埋め込み) が更新され、アセンブリ内のリソース名の指定、およびリソースがアセンブリ内でプライベートであることの指定ができるようになりました。/ASSEMBLYRESOURCE (Embed a Managed Resource) has been updated to now allow you to specify the name of the resource in the assembly, and to specify that the resource is private in the assembly.
  • /CLRIMAGETYPE (CLR イメージのタイプの指定) リンカー オプションが追加されました。/CLRIMAGETYPE (Specify Type of CLR Image) linker option has been added.
  • /CLRSUPPORTLASTERROR (PInvoke 呼び出しの最終エラー コードの保持) リンカー オプションが追加されました。/CLRSUPPORTLASTERROR (Preserve Last Error Code for PInvoke Calls) linker option has been added.
  • /CLRTHREADATTRIBUTE (CLR スレッド属性の設定) リンカー オプションが追加されました。/CLRTHREADATTRIBUTE (Set CLR Thread Attribute) linker option has been added.
  • /CLRUNMANAGEDCODECHECK (SuppressUnmanagedCodeSecurityAttribute の追加) リンカー オプションが追加されました。/CLRUNMANAGEDCODECHECK (Add SuppressUnmanagedCodeSecurityAttribute) linker option has been added.
  • /ERRORREPORT (内部リンカー エラーの報告) リンカー オプションが追加されました。/ERRORREPORT (Report Internal Linker Errors) linker option has been added.
  • /EXETYPE リンカー オプションが削除されました。/EXETYPE linker option has been removed. リンカーは、Windows 95 および Windows 98 のデバイス ドライバーの作成をサポートしなくなりました。The linker no longer supports creating Windows 95 and Windows 98 device drivers. これらのデバイス ドライバーを作成するには、適切な DDK を使います。Use an appropriate DDK to create these device drivers. EXETYPE キーワードが、モジュール定義ファイルに対して有効ではなくなりました。The EXETYPE keyword is no longer valid for module definition files.
  • /FUNCTIONPADMIN (ホットパッチ可能なイメージの作成) リンカー オプションが追加されました。/FUNCTIONPADMIN (Create Hotpatchable Image) linker option has been added.
  • /LTCG リンカー オプションが、/clr でコンパイルされたモジュールでサポートされるようになりました。/LTCG linker option is now supported on modules compiled with /clr. また、/LTCG はガイド付き最適化のプロファイルをサポートするように更新されました。/LTCG has also been updated to support profile-guided optimizations.
  • /MANIFEST (side-by-side アセンブリ マニフェストを作成する) リンカー オプションが追加されました。/MANIFEST (Create Side-by-Side Assembly Manifest) linker option has been added.
  • /MANIFESTDEPENDENCY (マニフェストの依存関係を指定する) リンカー オプションが追加されました。/MANIFESTDEPENDENCY (Specify Manifest Dependencies) linker option has been added.
  • /MANIFESTFILE (マニフェスト ファイルに名前を付ける) リンカー オプションが追加されました。/MANIFESTFILE (Name Manifest File) linker option has been added.
  • /MAPINFO:LINES リンカー オプションが削除されました。/MAPINFO:LINES linker option has been removed.
  • /NXCOMPAT (データ実行防止との互換性) リンカー オプションが追加されました。/NXCOMPAT (Compatible with Data Execution Prevention) linker option has been added.
  • /PGD (ガイド付き最適化のプロファイル用データベースの指定) リンカー オプションが追加されました。/PGD (Specify Database for Profile-Guided Optimizations) linker option has been added.
  • /PROFILE (パフォーマンス ツール プロファイラー) リンカー オプションが追加されました。/PROFILE (Performance Tools Profiler) linker option has been added.
  • /SECTION (セクション属性の指定) リンカー オプションが、属性の否定をサポートするようになり、L または D (VxD 関連) 属性をサポートしなくなりました。/SECTION (Specify Section Attributes) linker option now supports attribute negation and no longer supports the L or D (VxD-related) attributes.
  • コンパイラおよびリンカーでの Unicode のサポートUnicode Support in the Compiler and Linker
  • /VERBOSE (進行状況メッセージの出力) リンカー オプションが、ICF および REF も受け付けるようになりました。/VERBOSE (Print Progress Messages) linker option now also accepts ICF and REF.
  • /VXD リンカー オプションが削除されました。/VXD linker option has been removed. リンカーは、Windows 95 および Windows 98 のデバイス ドライバーの作成をサポートしなくなりました。The linker no longer supports creating Windows 95 and Windows 98 device drivers. これらのデバイス ドライバーを作成するには、適切な DDK を使います。Use an appropriate DDK to create these device drivers. VXD キーワードが、モジュール定義ファイルに対して有効ではなくなりました。The VXD keyword is no longer valid for module definition files.
  • /WS リンカー オプションが削除されました。/WS linker option has been removed. /WS は、Windows NT 4.0 を対象とするイメージの変更に使われていました。/WS was used to modify images targeted for Windows NT 4.0. /WS の代わりに、IMAGECFG.exe -R <ファイル名> を使うことができます。IMAGECFG.exe -R filename can be used instead of /WS. IMAGECFG.exe は、Windows NT 4.0 CD-ROM の SUPPORT\DEBUG\I386\IMAGECFG.EXE にあります。IMAGECFG.exe can be found on the Windows NT 4.0 CD-ROM in SUPPORT\DEBUG\I386\IMAGECFG.EXE.
  • /WX (リンカー警告をエラーとして扱う) リンカー オプションがドキュメントに記載されるようになりました。/WX (Treat Linker Warnings as Errors) linker option is now documented.

リンカー ユーティリティの新機能New Linker Utility Features

  • /ALLOWISOLATION editbin オプションが追加されました/ALLOWISOLATION editbin option had been added
  • DESCRIPTION モジュール定義ファイル ステートメントが削除されました。DESCRIPTION module definition file statement is removed. リンカーは、仮想デバイス ドライバーのビルドをサポートしなくなりました。The linker no longer supports building virtual device drivers.
  • /ERRORREPORT オプションが、bscmake.exe、dumpbin.exe、editbin.exe、lib.exe に追加されました。/ERRORREPORT option has been added to bscmake.exe, dumpbin.exe, editbin.exe, and lib.exe.
  • /LTCG lib オプションが追加されました。/LTCG lib option has been added.
  • /NXCOMPAT editbin オプションが追加されました。/NXCOMPAT editbin option has been added.
  • /RANGE dumpbin オプションが追加されました。/RANGE dumpbin option has been added.
  • /TLS dumpbin オプションが追加されました。/TLS dumpbin option has been added.
  • /WS editbin オプションが削除されました。/WS editbin option has been removed. /WS は、Windows NT 4.0 を対象とするイメージの変更に使われていました。/WS was used to modify images targeted for Windows NT 4.0. /WS の代わりに、IMAGECFG.exe -R <ファイル名> を使うことができます。IMAGECFG.exe -R filename can be used instead of /WS. IMAGECFG.exe は、Windows NT 4.0 CD-ROM の SUPPORT\DEBUG\I386\IMAGECFG.EXE にあります。IMAGECFG.exe can be found on the Windows NT 4.0 CD-ROM in SUPPORT\DEBUG\I386\IMAGECFG.EXE.
  • /WX[:NO] lib オプションが追加されました。/WX[:NO] lib option has been added.

NMAKE の新機能New NMAKE Features

  • /ERRORREPORT が追加されました。/ERRORREPORT has been added.
  • /G が追加されました。/G has been added.
  • 定義済みのルールが更新されました。The predefined rules have been updated.
  • 「再帰マクロ」に記載されている $(MAKE) マクロが、nmake.exe への完全なパスを提供するようになりました。The $(MAKE) macro, which is documented in Recursion Macros, now gives the full path to nmake.exe.

MASM の新機能New MASM Features

  • MASM の式が 64 ビット値になりました。MASM expressions are now 64-bit values. 以前のバージョンの MASM 式は 32 ビット値でした。In previous versions MASM expressions were 32-bit values.
  • 命令 __asm int 3 により、関数がネイティブにコンパイルされるようになりました。The instruction __asm int 3 now causes a function to be compiled to native.
  • ALIAS (MASM) がドキュメントに記載されるようになりました。ALIAS (MASM) is now documented.
  • /ERRORREPORT ml.exe and ml64.exe オプションが追加されました。/ERRORREPORT ml.exe and ml64.exe option is added.
  • .FPO がドキュメントに記載されるようになりました。.FPO is now documented.
  • H2INC.exe は Visual C++ 2005 では出荷されません。H2INC.exe will not ship in Visual C++ 2005. 引き続き H2INC を使う必要がある場合は、以前のバージョンの Visual C++ の H2INC.exe をお使いください。If you need to continue to use H2INC, use H2INC.exe from a previous version of Visual C++.
  • 演算子 IMAGEREL が追加されました。operator IMAGEREL has been added.
  • 演算子 HIGH32 が追加されました。operator HIGH32 has been added.
  • 演算子 LOW32 が追加されました。operator LOW32 has been added.
  • ml64.exe は、x64 アーキテクチャ用の MASM のバージョンです。ml64.exe is a version of MASM for the x64 architecture. x64 .asm ファイルを x64 オブジェクト ファイルにアセンブルします。It assembles x64 .asm files into x64 object files. インライン アセンブリ言語が x64 コンパイラでサポートされなくなりました。Inline assembly language is not supported in the x64 compiler. 以下の MASM ディレクティブが ml64.exe (x64) に追加されました。The following MASM directives have been added for ml64.exe (x64):
  • .ALLOCSTACK.ALLOCSTACK
  • .ENDPROLOG.ENDPROLOG
  • .PUSHFRAME.PUSHFRAME
  • .PUSHREG.PUSHREG
  • .SAVEREG.SAVEREG
  • .SAVEXMM128.SAVEXMM128
  • .SETFRAME さらに、PROC ディレクティブが x64 専用構文で更新されました。.SETFRAME In addition, the PROC directive was updated with x64-only syntax.
  • MMWORD ディレクティブが追加されましたMMWORD directive has been added
  • /omf (ML.exe コマンド ライン オプション) が /c を意味するようになりました。/omf (ML.exe command line option) now implies /c. ML.exe が OMF 形式オブジェクトのリンクをサポートしなくなりました。ML.exe does not support linking OMF format objects.
  • SEGMENT ディレクティブが追加属性をサポートするようになりました。The SEGMENT directive now supports additional attributes.
  • 演算子 SECTIONREL が追加されました。operator SECTIONREL has been added.
  • XMMWORD ディレクティブが追加されましたXMMWORD directive has been added

CRT の新機能New CRT Features

  • いくつかの関数のセキュリティで保護されたバージョンが追加されました。Secure versions of several functions have been added. これらの関数はより優れた方法でエラーを処理し、より厳密にバッファーを制御して、一般的なセキュリティ侵害を回避するのに役立ちます。These functions handle errors in a better way and enforce stricter controls on buffers to help avoid common security flaws. 新しいセキュリティで保護されたバージョンは、_s サフィックスによって識別されます。The new secure versions are identified by the _s suffix.
  • 既存の安全性の低いバージョンの関数の多くは非推奨とされました。Existing less secure versions of many functions have been deprecated. 廃止の警告を無効にするには、_CRT_SECURE_NO_WARNINGS を定義します。To disable the deprecation warnings, define _CRT_SECURE_NO_WARNINGS.
  • 既存の関数の多くは、パラメーターを検証し、無効なパラメーターが渡されたときは無効パラメーター ハンドラーを呼び出します。Many existing functions now validate their parameters and invoke the invalid parameter handler when an invalid parameter is passed.
  • 多くの既存関数は、以前は設定しなかった場所で errno を設定するようになりました。Many existing functions now set errno where they did not before.
  • 整数型の typedef errno_t が追加されました。The typedef errno_t with type integer was added. 関数の戻り値の型またはパラメーターが errno からのエラー コードを処理するたびに、errno_t が使われます。errno_t is used whenever a function return type or parameter deals with error codes from errno. errcodeerrno_t に置き換えられます。errno_t replaces errcode.
  • ロケールに依存する関数に、現在のロケールを使うのではなく、ロケールをパラメーターとして受け取るバージョンができました。Locale-dependent functions now have versions which take the locale as a parameter rather than using the current locale. これらの新しい関数には、_l というサフィックスが付いています。These new functions have the _l suffix. ロケール オブジェクトを処理するために複数の新しい関数が追加されました。Several new functions were added to work with locale objects. 新しい関数は、_get_current_locale_create_locale_free_locale などです。New functions include _get_current_locale, _create_locale and _free_locale.
  • ファイル ハンドルのロックおよびロック解除をサポートするために、新しい関数が追加されました。New functions were added to support locking and unlocking file handles.
  • _spawn ファミリの関数は、以前のバージョンでは成功時に errno をゼロにリセットしていましたが、リセットしなくなりました。The _spawn family of functions does not reset errno to zero on success, as it did in previous versions.
  • 引数の使用順序を指定できるバージョンの printf 関数ファミリが、使用できるようになりました。Versions of the printf family of functions that allow you to specify the order in which the arguments are used are available.
  • Unicode がテキスト形式としてサポートされるようになりました。Unicode is now a supported text format. 関数 _open が、_O_TEXTW、_O_UTF8、_O_UTF16 の各属性をサポートするようになりました。The function _open supports _O_TEXTW, _O_UTF8 and _O_UTF16 attributes. fopen 関数が、"ccs=ENCODING" で Unicode 形式を指定する方法をサポートするようになりました。The fopen function supports the "ccs=ENCODING" method of specifying a Unicode format.
  • マネージド コード (MSIL) でビルドされた CRT ライブラリの新しいバージョンが使用できるようになり、/clr (共通言語ランタイムのコンパイル) オプションでコンパイルするときに使われます。A new version of the CRT libraries built in managed code (MSIL) is now available and is used when compiling with the /clr (Common Language Runtime Compilation) option.
  • _fileinfo が削除されました。_fileinfo has been removed.
  • time_t の既定のサイズが 64 ビットになり、time_t および複数の時間関数の範囲が 3000 年まで拡張されました。The default size for time_t is now 64 bits, which expands the range of time_t and several of the time functions out to the year 3000.
  • CRT が、スレッド単位でのロケール設定をサポートするようになりました。The CRT now supports setting the locale on a per thread basis. この機能をサポートするために、関数 _configthreadlocale が追加されました。The function _configthreadlocale was added to support this feature.
  • x87 と SSE2 両方の浮動小数点プロセッサで浮動小数点制御ワードにアクセスして制御できるように、_statusfp2 関数と __control87_2 関数が追加されました。The _statusfp2 and __control87_2 functions were added to allow access to and control of the floating point control word on both the x87 and SSE2 floating point processor.
  • 時刻 (tm 構造体) のグリニッジ標準時 (GMT) への変換をサポートするために、_mkgmtime 関数と _mkgmtime64 関数が追加されました。The _mkgmtime and _mkgmtime64 functions were added to provide support for converting times (struct tm) to Greenwich Mean Time (GMT).
  • 標準への準拠を向上させるため、swprintfvswprintf が変更されました。Changes were made to swprintf and vswprintf to better conform with the standard.
  • 新しいヘッダー ファイル INTRIN.H で、一部の組み込み関数のプロトタイプが提供されるようになりました。A new header file, INTRIN.H, provides prototypes for some intrinsic functions.
  • fopen 関数に N 属性が追加されました。The fopen function now has an N attribute.
  • _open 関数に _O_NOINHERIT 属性が追加されました。The _open function now has an _O_NOINHERIT attribute.
  • atoi 関数が、オーバーフロー時に INT_MAX を返して errno を ERANGE に設定するようになりました。The atoi function now returns INT_MAX and sets errno to ERANGE on overflow. 以前のバージョンでは、オーバーフロー時の動作が定義されていませんでした。In previous versions, the overflow behavior was undefined.
  • 関数の printf ファミリが、形式種類指定子 %a と %A を使用する ANSI C99 標準に従って実装された 16 進浮動小数点数出力をサポートするようになりました。The printf family of functions supports hexadecimal floating point output implemented according to the ANSI C99 standard using the format type specifiers %a and %A.
  • printf ファミリが、"ll" (long long) サイズ プレフィックスをサポートするようになりました。The printf family now supports the "ll" (long long) size prefix.
  • _controlfp 関数が、パフォーマンス向上のために最適化されました。The _controlfp function has been optimized for better performance.
  • 複数の関数のデバッグ バージョンが追加されました。Debug versions of some functions have been added.
  • _chgsignl および _cpysignl (long double バージョン) が追加されました。Added _chgsignl and _cpysignl (long double versions).
  • _locale_t 型が型テーブルに追加されました。Added _locale_t type to type table.
  • 配列の要素数の計算用に、新しいマクロ _countof が追加されました。New macro _countof Macro added for computing number of elements in an array.
  • 各関数のトピックに、等価な .NET Framework のセクションが追加されました。In each function topic, a section on .NET Framework equivalents has been added.
  • 複数の文字列関数に、出力バッファーが小さすぎる場合に失敗するのではなく文字列を切り捨てるオプションが追加されました。_TRUNCATE をご覧ください。Several string functions now have the option of truncating strings rather than failing when output buffers are too small; see _TRUNCATE.
  • _set_se_translator に対し、/EHa コンパイラ オプションの使用が必要になりました。_set_se_translator now requires the use of the /EHa compiler option.
  • fpos_t__int64 /Za (c コードの場合) と__STDC__が手動で設定されている場合 (C++ コードの場合) になります。fpos_t is now __int64 under /Za (for C code) and when STDC is set manually (for C++ code). これは、として使用されていま struct した。It used to be a struct.
  • _CRT_DISABLE_PERFCRIT_LOCKS を指定すると、シングルスレッド プログラムの I/O パフォーマンスが向上します。_CRT_DISABLE_PERFCRIT_LOCKS can improve the I/O performance of single-threaded programs.
  • POSIX 名が非推奨とされ、ISO C++ に準拠する名前が使われるようになりました (たとえば、getch ではなく _getch を使います)。POSIX names have been deprecated in favor of ISO C++ conformant names (for example, use _getch rather than getch).
  • 新しいリンク オプションの .obj ファイルが、ピュア モードに使用できるようになりましたNew link options .obj files are available for pure mode
  • _recalloc は、realloccalloc の機能を結合します。_recalloc combines features of realloc and calloc.

Visual Studio 2003 での C++ の新機能What's New for C++ in Visual Studio 2003

コンパイラCompiler

  • 現在のバージョンのコンパイラでビルドされた Managed Extensions for C++ アプリケーションを以前のバージョンのランタイムで実行する方法についての情報。Information on how to run a Managed Extensions for C++ application built with the current version's compiler on a previous version of the runtime.
  • Managed Extensions for C++ に関してよく寄せられる質問。Managed Extensions for C++ Frequently Asked Questions.
  • 既存のネイティブ アプリケーションを Managed Extensions for C++ を使うように移植する方法を示すチュートリアルが追加されました: Walkthrough: Porting an Existing Native C++ Application to Interoperate with .NET Framework Components (チュートリアル: 既存のネイティブ C++ アプリケーションを .NET Framework コンポーネントと相互動作させるための移植)。A walkthrough has been added showing how to port an existing, native application to use Managed Extensions for C++: Walkthrough: Porting an Existing Native C++ Application to Interoperate with .NET Framework Components.
  • 値の型のメソッドへのデリゲートを作成できるようになりました。You can now create a delegate on a method of a value type.
  • C++ 標準へのコンパイラの準拠が、Visual C++ .NET 2003 で大幅に強化されました。The compiler's conformance with the C++ standard has been significantly enhanced for Visual C++ .NET 2003.
  • /arch コンパイラ オプションが追加されました。/arch compiler option is added.
  • /Gf が非推奨とされ、次のバージョンの Visual C++ では削除されます。/Gf is deprecated and will be removed in the next version of Visual C++.
  • /G7 コンパイラ オプションが追加されました。/G7 compiler option is added.
  • 直接バッファー オーバーランからローカル変数を保護するように、/GS コンパイラ オプションが強化されました。The /GS compiler option has been enhanced to help protect local variables from direct buffer overruns.
  • /noBool コンパイラ オプションが削除されました。The /noBool compiler option has been removed. コンパイラは、 bool C++ ソースコードファイル内でキーワード (識別子ではなく) としてのみ表示できるようになりました。The compiler now allows bool to appear only as a keyword (and not an identifier) in a C++ source code file.
  • この long long 型は現在、 typedef __int64 CRT ではまだサポートされていないことに注意して long long ください。The long long type is now available as a typedef of __int64 Note that there is not yet support for long long in the CRT.
  • /Zm コンパイラ オプションが、プリコンパイル済みヘッダーのメモリ割り当て制限を指定するようになりました。The /Zm compiler option now specifies the precompiled header memory allocation limit.
  • _InterlockedCompareExchange 組み込み関数がドキュメントに記載されるようになりました。_InterlockedCompareExchange intrinsic now documented.
  • _InterlockedDecrement 組み込み関数がドキュメントに記載されるようになりました。_InterlockedDecrement intrinsic now documented.
  • _InterlockedExchange 組み込み関数がドキュメントに記載されるようになりました。_InterlockedExchange intrinsic now documented.
  • _InterlockedExchangeAdd 組み込み関数がドキュメントに記載されるようになりました。_InterlockedExchangeAdd intrinsic now documented.
  • _InterlockedIncrement 組み込み関数がドキュメントに記載されるようになりました。_InterlockedIncrement intrinsic now documented.
  • _ReadWriteBarrier 組み込み関数が追加されました。_ReadWriteBarrier intrinsic added.

属性Attributes

  • implements 属性がドキュメントに記載されるようになりました。implements attribute is now documented.

リンカーの機能Linker features

次のリンカー スイッチが追加されました。The following linker switches have been added:

  • /ASSEMBLYDEBUG/ASSEMBLYDEBUG
  • /ASSEMBLYLINKRESOURCE/ASSEMBLYLINKRESOURCE
  • DELAYSIGNDELAYSIGN
  • /KEYFILE/KEYFILE
  • /KEYCONTAINER/KEYCONTAINER
  • /SAFESEH/SAFESEH

MASMMASM

.SAFESEH ディレクティブと /safeseh ml.exe オプションが追加されました。The .SAFESEH directive and /safeseh ml.exe option were added.

関連項目See also

Visual C++ 移植とアップグレードのガイドVisual C++ Porting and Upgrading Guide