Open yumetodo opened 8 years ago
問題はVC++2015で暗黙にconstexpr指定
されない事と、VC++2013でmoveコンストラクタにdefaultが使えない事ですね...。
VC++2015では下のコードがエラーになります。
template<typename T>
class constexpr_class
{
public:
constexpr_class() = default;
T v = 10;
};
constexpr constexpr_class<int> c;
int main()
{
int arr[c.v];
return 0;
}
ちなみにconstexprを付けた状態で、UDTをTにいれてもVC++2015では問題ないです。
template<typename T>
class constexpr_class
{
public:
constexpr constexpr_class() = default;
T v = 10;
};
class non_constexpr_class
{
public:
non_constexpr_class(int) {}
};
constexpr constexpr_class<int> c;
int main()
{
int arr[c.v];
constexpr_class<non_constexpr_class> c2;
return 0;
}
あと、clangで試したら
default initialization of an object of const type 'const constexpr_class<int>' without a user-provided default constructor
と怒られました。constなオブジェクトのデフォルトコンストラクタはユーザーが定義する必要があるとのこと。
何が正しいのか分からなくなってきたので、とりあえず結論を保留して、調査結果だけ書いておきます。
うーん、なんだかよくわからない・・・。Clangの結果が。
Clang 3.7 http://melpon.org/wandbox/permlink/paW4sELvA5Q3j6lf Clang 3.8 http://melpon.org/wandbox/permlink/WxYsS6jvtknFfJzz Clang 3.9 http://melpon.org/wandbox/permlink/vyPJ0e6Za5I9LIyV GCC 5.2.0 http://melpon.org/wandbox/permlink/sI6mYNsHOxcjb71E GCC6.0.0 http://melpon.org/wandbox/permlink/1wnCFG0ioX9eiiOB
ほう・・・
もしかして:Clangのバグ?
clangのバグではないと思います。 http://d.hatena.ne.jp/tkng/20110419/1303176182 n3797には
If a program calls for the default initialization of an object of a const-qualified type T, T shall be a class
type with a user-provided default constructor.
と書いてありますね。
あー、そういやそんな話あったな、というかそのサイト見たことあるぞ・・・。
とりあえずdefault/delete指定はmove系およびconstexprが絡む場合は使わないとして、現状は問題ない・・・のかな
というのを見て座標系クラスがどうなっているか見たんですが
これ大丈夫なのかな、ダメな気がしてきたのでissue立てました
@Nagarei