C++ 17に切り替えてカスタムstd::optional
ソリューションを標準のものに置き換えると、本当に奇妙で予想外のclang 5の動作が検出されました。何らかの理由でemplace()
がパラメータクラスの特性std::is_constructible
の誤った評価のために無効になっていました。clang 5:std ::オプションのインスタンス化ネジstd :: is_constructible特性のパラメータタイプ
それが再現する前にいくつかの特定の前提条件が満たされている必要がありますgodbolt.org
変動に関する
#include <optional>
/// Precondition #1: T must be a nested struct
struct Foo
{
struct Victim
{
/// Precondition #2: T must have an aggregate-initializer
/// for one of its members
std::size_t value{0};
};
/// Precondition #3: std::optional<T> must be instantiated in this scope
std::optional<Victim> victim;
bool foo()
{
std::optional<Victim> foo;
// An error
foo.emplace();
/// Assertion is failed
static_assert(std::is_constructible<Victim>::value);
}
};
ライブ例の前提条件のいずれかと期待どおりにコンパイルします。スタンダードにいくつかの未知の矛盾があり、遵守している間にこのコードを拒否するのですか?
サイドノートとして:GCC 7.1およびGCC 7.2は、上記のコードに問題はありません。
バグレポートで:bugs.llvm.org
コンパイラのバグになる可能性があります。 –
@CrisLuengo、私はそれが標準よりも修正する方が簡単だから願っています。 – GreenScape
あなたの中心は、本当に言語弁護士の質問です。そのように答えられるべきです。 – StoryTeller