タグ付けされた質問 「visual-c++」

Microsoft Visual C ++は、Windows用のC、C ++、およびC ++ / CLIコンパイラです。コンパイラの最新バージョンはVisual C ++ 2019です。コンパイラは次の言語をサポートしています。C(Visual Studio 2019の時点で、ISO C ++標準のC90およびC99およびC11のほとんどの部分をサポートしています)。C ++(Visual Studio 2019の時点で、ほとんどのC ++ 11、C ++ 14、C ++ 17機能と一部のC ++ 20機能のサポート)C ++ / CLI(C#などの.NET言語との相互運用性を提供します)。

2
配列のサイズを取得するためのこのテンプレートコードはどのように機能しますか?
なぜこの種のコードはテスト配列のサイズを取得できるのでしょうか。テンプレートの文法に慣れていません。多分誰かが下のコードの意味を説明できるでしょうtemplate<typename,size_t>。また、参照リンクも推奨されます。 #define dimof(array) (sizeof(DimofSizeHelper(array))) template <typename T, size_t N> char(&DimofSizeHelper(T(&array)[N]))[N]; void InitDynCalls() { char test[20]; size_t n = dimof(test); printf("%d", n); }
61 c++  visual-c++ 

2
整数->ポインター変換規則
次のコードを検討してください。 void f(double p) {} void f(double* p) {} int main() { f(1-1); return 0; } MSVC 2017はそれをコンパイルしません。と1-1同じ0であるため、あいまいなオーバーロードされた呼び出しがあることを示しているため、に変換できますdouble*。他のトリックは、のような0x0、0Lまたはstatic_cast<int>(0)、いずれかの動作しません。を宣言しconst int Zero = 0て呼び出しf(Zero)ても同じエラーが発生します。それは場合にのみ正しく動作Zeroではありませんconst。 同じ問題がGCC 5以下に当てはまるようですが、GCC 6には当てはまりません。これがC ++標準の一部であるか、既知のMSVCバグであるか、コンパイラーの設定であるかどうか知りたいです。おおざっぱなグーグルは結果をもたらさなかった。
19 c++  visual-c++  types 

1
Clangはコードをコンパイルしませんが、gccとmsvcはそれをコンパイルしました
何が問題なのか理解できません。コードまたはコンパイラ(可能性が低い)のどちらかです。次のようなコードがあります。 #include <iostream> #include <type_traits> #include <set> template<typename T, typename = void> struct TestA: std::false_type {}; template<typename T> struct TestA<T, std::void_t<typename T::reverse_iterator>> : std::true_type {}; template<typename T> struct TestA<T, std::void_t<typename T::dummy_iterator>> : std::true_type {}; int main() { std::cout << TestA<std::set<int>>::value; } GCCとMSVCの両方でコンパイルします。GCCとMSVC 17(ローカル)および19の異なるバージョンを使用して、godboltでテストしました。リンクは次のとおりです:https ://godbolt.org/z/Enfm6L 。 しかし、Clangはそれをコンパイルせず、エラーを出します。 redefinition of `'TestA<T, std::void_t<typename …

1
MSVCのコンパイラのバグの可能性
次のコードは、gccとclang(および他の多くのC ++ 11コンパイラ)でコンパイルされます。 #include <stdint.h> typedef int datatype; template <typename T> struct to_datatype {}; template <> struct to_datatype<int16_t> { static constexpr datatype value = 1; }; template <typename T> class data { public: data(datatype dt = to_datatype<T>::value) {} }; int main() { data<char> d{to_datatype<int16_t>::value}; } (ほぼ)最新のMSVCでコンパイルする場合 > cl .\test.cpp /std:c++latest …
13 c++  c++11  visual-c++ 

1
C ++ 17での初期化後にインライン変数を変更できますか?
私のシナリオは以下です(それはclangでは機能しましたがgccでは機能しませんでした) liba.hpp: inline int MY_GLOBAL = 0; libother.cpp:(dll) #include "myliba.hpp" void myFunc() { // MYGLOBAL = 28; } someexe.cpp: RunAppThatUsesBothLibAandLibOther(); 問題は、インライン変数が実行時にすでに変更されていたため、28を期待した場所でインライン変数が0を示していたことです。MSVCはこれに同意しませんが、clangは私が期待することを行います。 問題は、私のシナリオでは、実行時にインライン変数を変更できるかどうかです。(変数をインライン展開することで問題を解決しました。)
11 c++  visual-c++  dll  clang  c++17 

3
nullptrをuintptr_tに変換できますか?異なるコンパイラは同意しません
このプログラムを考えてみましょう: #include <cstdint> using my_time_t = uintptr_t; int main() { const my_time_t t = my_time_t(nullptr); } msvc v19.24でコンパイルできませんでした: <source>(5): error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'my_time_t' <source>(5): note: A native nullptr can only be converted to bool or, using reinterpret_cast, to an integral type <source>(5): error C2789: 't': …
10 c++  c++11  gcc  visual-c++  clang 

1
-fno-char8_tに相当するMSVCは何ですか?
C ++ 20では、u8文字列リテラルはchar8_t型に基づいています。それらは故意にchar const*これ以上変換しません: const char* str = u8"Hall\u00f6chen \u2603"; // no longer valid in C++20 もちろん、C ++ 20に移行する際の最終的な目標は、新しい動作に完全に対応することです(上記の例では、のタイプを変更しstrます)。ただし、サードパーティのライブラリのため、これはすぐに実行できないことがよくあります。 導入と「改善」を 提案する提案は、それをchar8_t予測し、clangとgccには-fno-char8_t、古い動作に切り替えるフラグがあります(他のC ++ 20機能は引き続き利用可能です)。 2番目の提案は、Microsoftが同様のフラグに従い、追加するという期待を設定していますが、設定方法を見つけることができませんでした(少なくともVS 2019、バージョン16.4)。 では、MSVCと同等のものは誰か知ってい-fno-char8_tますか?

1
コンパイラは、暗黙的に宣言された仮想デストラクタの実装を単一の個別の翻訳単位に配置できますか?
次のコードはVisual Studio(2017と2019の両方で/permissive-)でコンパイルおよびリンクしますが、gccまたはでコンパイルしませんclang。 foo.h #include <memory> struct Base { virtual ~Base() = default; // (1) }; struct Foo : public Base { Foo(); // (2) struct Bar; std::unique_ptr<Bar> bar_; }; foo.cpp #include "foo.h" struct Foo::Bar {}; // (3) Foo::Foo() = default; main.cpp #include "foo.h" int main() { auto foo = std::make_unique<Foo>(); …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.