Các mã sau đây gây nên static_assert
mặc dù tôi không nghĩ rằng nó nên:hành vi kỳ lạ của std :: is_nothrow_destructible
#include <type_traits>
template< typename T >
struct Tmp
{
~Tmp() noexcept(std::is_nothrow_destructible<T>::value) {}
};
struct Foo;
struct Bar
{
// Comment this out for the problem to go away
Tmp<Foo> xx;
// ..or this
Bar() {}
};
struct Foo {};
// This triggers
static_assert(std::is_nothrow_destructible<Foo>::value, "That's odd");
int main()
{
}
Khi biên soạn với:
g++-4.9 -std=c++11 nothrow_destructible_bug.cc
Sau đây sẽ xảy ra:
nothrow_destructible_bug.cc:20:1: error: static assertion failed: That's odd
static_assert(std::is_nothrow_destructible<Foo>::value, "That's odd");
^
Cách chỉ sử dụng Foo
để tạo mẫu trong một lớp học không liên quan làm cho nó mất tình trạng noexcept
của nó? Tôi nghĩ rằng đây là một lỗi trình biên dịch, nhưng tôi đã thử nó với tất cả các phiên bản gần đây của cả gcc và clang và tất cả họ dường như cung cấp cho cùng một lỗi.
Ý của bạn là kiểm tra 'is_nothrow_destructible < Bar >' thay vì 'is_nothrow_destructible < Foo >'? –