Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

非リテラル型な任意のUDT(User-Defined Type)に対して、constexprコピーコンストラクタはill-formedになる #22

Open
yumetodo opened this issue May 19, 2019 · 10 comments
Labels
enhancement New feature or request

Comments

@yumetodo
Copy link
Contributor

以前某中3女子に質問をしたことがあって、

https://gcc.gnu.org/ml/libstdc++/2012-10/msg00120.html

diff --git a/libstdc++-v3/include/std/chrono b/libstdc++-v3/include/std/chrono
index 209f395..d920a7d 100644
--- a/libstdc++-v3/include/std/chrono
+++ b/libstdc++-v3/include/std/chrono
@@ -250,7 +250,10 @@ _GLIBCXX_END_NAMESPACE_VERSION
    // 20.11.5.1 construction / copy / destroy
    constexpr duration() = default;

-   constexpr duration(const duration&) = default;
+   // NB: Make constexpr implicit. This cannot be explicitly
+   // constexpr, as any UDT that is not a literal type with a
+   // constexpr copy constructor will be ill-formed.
+   duration(const duration&) = default;

    template<typename _Rep2, typename = typename
           enable_if<is_convertible<_Rep2, rep>::value

という変更がどういう意味かを問い合わせたことがありました。

@yumetodo 直訳:暗黙にconstexpr指定される。非リテラル型な任意のUDT(User-Defined Type)に対して、constexprコピーコンストラクタはill-formedになるため、明示的にconstexpr指定すべきでない。

— 狂える中3女子ボレロ村上/陶芸C++er (@bolero_MURAKAMI) 2016年3月14日

@yumetodo つまり、duration<Rep> の Rep は非リテラル型なユーザ定義型である可能性があるため、明示的にconstexpr指定しないようにする変更。Rep がリテラル型である場合、トリビアルコピーコンストラクタは暗黙にconstexpr指定される。

— 狂える中3女子ボレロ村上/陶芸C++er (@bolero_MURAKAMI) 2016年3月14日

と回答していただきました。

さて、例えば

		template<typename Int_>
		struct Coordinate1Dimensional {
			Int_ x{};
			constexpr Coordinate1Dimensional() = default;
			constexpr Coordinate1Dimensional(const Int_& x_) noexcept :x(x_) {};
		};

をみると、上と全く同じ状況であることがわかります。

@yumetodo
Copy link
Contributor Author

ただまぁもしVS2015をサポートする気があるとしたら話はもう少し複雑です

Nagarei/DxLibEx#52 (comment)
問題はVC++2015で暗黙にconstexpr指定されない事と、VC++2013でmoveコンストラクタにdefaultが使えない事ですね...。

@AsPJT
Copy link
Owner

AsPJT commented May 19, 2019

出来ればVisual Studio 2015でも動かせるようにしたいですね。
世の中、Visual Studio 2010や2013もまだまだ残っていますし……。
(どこまで対応できるかは未知数)

@yumetodo
Copy link
Contributor Author

いまからVS2013となるともうそれはそれ用に一から書き直して分ける方が幸せだと思います。VS2015 Update 2より前ではconstexprはまともに動かないし、VS2013ではSFINAEもしょっちゅうバグる。DxLibEx見てもらえると分かりますがめっちゃ汚いハックやマクロで逃げているところがあるので、2010や2012となるともはや考えたくもない。

@AsPJT
Copy link
Owner

AsPJT commented May 19, 2019

Visual Studio 2013は諦めるとしても
Visual Studio 2015には対応させたいですね。
(そもそもVisual Studio 2013は手元にない)

@yumetodo
Copy link
Contributor Author

VS2015 Update 2以降ならまあC++11はわりと動くと思いますよ。時折コンパイラがクラッシュしますが。

@AsPJT
Copy link
Owner

AsPJT commented May 19, 2019

そうなんですね。
わたしはVisual Studio 2017から入った世代なので、
そこまでVisual Studio 2015の歴史は詳しくないのですよね……。

(昔のMSVC勢は今よりも遥かに大変だったのですね)
Visual Studio 2015 update 2をサポートの上、実装していきたいです。

@yumetodo
Copy link
Contributor Author

なんだかんだVS2015とVS2019はバイナリ互換があるという・・・

@AsPJT
Copy link
Owner

AsPJT commented May 19, 2019

Visual Studio 2019にもv140(でしたっけ?)
のビルドツール付いてますよね。

一応、v140で動くようには設計しています。
(ただv140で動く機能の詳細を知らないので、アプデでいつのまにか動かなくなりそう)

@yumetodo
Copy link
Contributor Author

まあv140系列はもうそれかUpdate3しかないですよね、Update2で止めている人とかいるんだろうか(私はUpdate 3、_MSC_FULL_VER==190024210)

@AsPJT
Copy link
Owner

AsPJT commented May 19, 2019

使用ユーザの割合もかなり気になります。
Visual Studio 2010, 2013は何パーセント残っているんですかね。

Visual Studio 2015 update 2を使用しているユーザはほとんどないのではないでしょうか。
(update 3ならある程度いそうですが)

@AsPJT AsPJT added the enhancement New feature or request label May 20, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants