Tôi có đoạn như sau:Tại sao hoán đổi các mảng đa chiều không phải là ngoại lệ?
#include <algorithm>
#include <iostream>
int main(int argc, char** argv) {
int x[2][3];
int y[2][3];
using std::swap;
std::cout << noexcept(swap(x, y)) << "\n";
return 0;
}
Sử dụng GCC 4.9.0, đây in 0
. Tôi không hiểu tại sao.
Theo tiêu chuẩn có hai quá tải cho std::swap
:
namespace std {
template<class T> void swap(T& a, T& b) noexcept(
is_nothrow_move_constructible<T>::value &&
is_nothrow_move_assignable<T>::value
);
template<class T, size_t N>
void swap(T (&a)[N], T (&b)[N]) noexcept(noexcept(swap(*a, *b)));
}
Trong sự hiểu biết của tôi noexcept
specifier cho mảng nên làm việc một cách đệ quy cho mảng đa chiều.
Tại sao hoán đổi các mảng đa chiều không phải là noexcept
?
Trong khi cố gắng tìm một ví dụ rất nhỏ mà vẫn cư xử kì lạ tôi đã đưa ra như sau:
#include <iostream>
template<class T> struct Specialized : std::false_type {};
template<> struct Specialized<int> : std::true_type {};
template<class T> void f(T& a) noexcept(Specialized<T>::value);
template<class T, std::size_t N> void f(T (&a)[N]) noexcept(noexcept(f(*a)));
int main(int argc, char** argv) {
int x, y[1], z[1][1];
std::cout << noexcept(f(x)) << " "
<< noexcept(f(y)) << " "
<< noexcept(f(z)) << "\n";
}
Sử dụng GCC 4.9.0 này in 1 1 0
, nhưng một lần nữa tôi không hiểu tại sao.
[clang say 1] (http://coliru.stacked-crooked.com/a/9d1c1e7307dda039) –
Có vẻ rất lạ với tôi. Tôi đã tìm thấy [DR 809] (http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#809) [xuất hiện] (https://gcc.gnu.org/ onlinedocs/gcc-4.9.0/libstdC++/api/a01316_source.html # l00185) được [triển khai] (https://gcc.gnu.org/onlinedocs/libstdc++/manual/bugs.html) trong libstdC++ do đó có thể lỗi nằm ở nơi khác. Mỗi lần chỉnh sửa mới nhất của bạn, [clang] (http://coliru.stacked-crooked.com/a/79dd288d30d8f159) cũng in '1 1 0'. clang với libC++ in '0' cho đoạn mã gốc. –
[Coliru] (http://coliru.stacked-crooked.com/a/7fa0b200e56d1bd4), [2] (http://coliru.stacked-crooked.com/a/485e10b802dd3a96) –