Следующий код вызывает static_assert
хотя я не думаю, что он должен:Странное поведение станд :: 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()
{
}
при компиляции:
g++-4.9 -std=c++11 nothrow_destructible_bug.cc
происходит следующее:
nothrow_destructible_bug.cc:20:1: error: static assertion failed: That's odd
static_assert(std::is_nothrow_destructible<Foo>::value, "That's odd");
^
Почему просто использование Foo
для создания шаблона в несвязанном классе заставляют его потерять свой статус noexcept
? Я думал, что это ошибка компилятора, но я попробовал ее со всеми последними версиями как gcc, так и clang, и все они, похоже, дают ту же ошибку.
Возможно, вы имели в виду 'is_nothrow_destructible < Bar >' вместо 'is_nothrow_destructible < Foo >'? –