環境
処理系は clang 6.0.1 と gcc 7.3.0 の 32 ビット版で、 MSYS2 上で使っています。
問題
using
を用いて二次元配列型の別名 matrix
を定義したのですが、念のために要素の数として与えられた数値が正の数かどうかを std::enable_if
でチェックするようにしたところ、動作が変わってしまいました。
どうしてこのような差が生まれるのでしょう?
ソースコード
具体的にいうと、以下のコードでマクロで分岐している箇所を切り替えたような場合です。
cpp
1#include <iostream> 2#include <type_traits> 3 4#ifndef ENABLE_SIZE_CHECKING 5template<class T, std::size_t Y, std::size_t X> 6using matrix = T[Y][X]; 7#else 8template<class T, size_t Y, size_t X> 9using matrix = typename std::enable_if<(Y>0)&&(X>0), T[Y][X]>::type; 10#endif 11 12template<class T, size_t Y, size_t X> 13std::ostream& operator<<(std::ostream& os, const matrix<T, Y, X>& mat) { 14 for (auto& i: mat) { 15 for (auto j: i) os << j << ','; 16 os << std::endl; 17 } 18 19 return os; 20} 21 22int main() { 23 matrix<int, 3, 3> mat; 24 25 for (auto& line: mat) for (auto& element: line) element = 10; 26 std::cout << "array rank is " 27 << std::rank<decltype(mat)>::value 28 << std::endl; 29 std::cout << mat <<std::endl; 30 31 return 0; 32}
実行結果
std::enable_if
での判定をしない場合
array rank is 2 10,10,10, 10,10,10, 10,10,10,
std::enable_if
での判定をする場合
array rank is 2 0x65fec0
補足
上記のコードでトレイトでの判定も入れていることからわかるように変数は確かに二次元配列として定義されていて、暗黙の型変換が入る余地もないはずなのですが、ポインタとして解釈されているような挙動になっているように思われます。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。