std::initializer_list
を関数パラメータとして取るように既存のコードを変更したときに、奇妙なことに気付きました。これは元のコードでした:
function(type_t<t> parameter)
そして、これは関数宣言のみを次のように変更したものです。
function(std::initializer_list<type_t<t>> parameter)
次に、コードをコンパイルして、変更のために変更する必要があるエラーのリストを取得しました。誰もいなかったときは驚きました。また、プログラムを実行したところ、以前と同じように動作しました。の適切な使用と意図された動作はありstd::initializer_list
ますか?
編集:これが問題の実際のコードです。関数定義:
bool Coaxial(const std::initializer_list<Vector2<t>> _l) const
{
bool result_x = 1;
bool result_y = 1;
for(Vector2<t> other : _l)
{
if(other.x() != x())
result_x = 0;
}
for(Vector2<t> other : _l)
{
if(other.x() != x())
result_x = 0;
}
return (result_x || result_y);
};
そしてそれが呼ばれる場所:
static std::vector<AxisAligned_Rectangle2<t> > Construct(std::vector<Vector2<t> > _set)
{
std::vector<AxisAligned_Rectangle2<t> > result;
if(_set.size() == 2)
{
if(!_set[0].Coaxial(_set[1]))
{
if(std::abs(_set[0].x()) <= std::abs(_set[1].x()) && std::abs(_set[0].y()) <= std::abs(_set[1].y()))
{
result.push_back(AxisAligned_Rectangle2<t>(_set[0], _set[1].x() - _set[0].x(), _set[1].y() - _set[0].y()));
}
else
{
result.push_back(AxisAligned_Rectangle2<t>(_set[1], _set[0].x() - _set[1].x(), _set[0].y() - _set[1].y()));
}
}
}
else if(_set.size())
{
bool valid = 1;
Vector2<t> origin(_set[0]);
Vector2<t> opposite(_set[0]);
for(int i=0; i<_set.size(); ++i)
{
if(std::abs(_set[i].x()) <= std::abs(origin.x()) && std::abs(_set[i].y()) <= std::abs(origin.y()))
origin = _set[i];
if(std::abs(_set[i].x()) >= std::abs(opposite.x()) && std::abs(_set[i].y()) >= std::abs(opposite.y()))
opposite = _set[i];
}
for(int i=0; i<_set.size(); ++i)
{
if(!_set[i].Coaxial(origin) && !_set[i].Coaxial(opposite))
valid = 0;
}
if(valid)
result.push_back(AxisAligned_Rectangle2<t>(origin, opposite.x() - origin.x(), opposite.y() - origin.y()));
}
return result;
};
コードがコンパイルされ、動作します。initializer_list の単一要素としてベクトルではなく、ベクトルを入力しているだけであることに注意してください。