Я пытаюсь использовать предложение «Требуется », и она работает только в том случае, если используется на фактическом конкретном объекте, передаваемом в качестве аргумента функции, но не тот, который дано Declval :
struct ImageMipInfo
{
ImageMipInfo() {}
ImageMipInfo(int a)
{}
static inline constexpr int JUST_SERIALISE_ME_BY_MEMCPYING{};
};
template
static constexpr bool isTypeMemcopyableUsingArgumentObject(T& arg)
{
constexpr bool bHasMemcpyOverride = requires { arg.JUST_SERIALISE_ME_BY_MEMCPYING; };
return bHasMemcpyOverride;
}
template
static constexpr bool isTypeMemcopyableUsingDeclVal()
{
constexpr bool bHasMemcpyOverride = requires { declval().JUST_SERIALISE_ME_BY_MEMCPYING; };
return bHasMemcpyOverride;
}
int main() {
ImageMipInfo mip_info;
static_assert(isTypeMemcopyableUsingArgumentObject(mip_info)); // This passes
static_assert(isTypeMemcopyableUsingDeclVal()); // This doesn't pass
}
< /code>
Ошибка, которую я получаю на Clang: < /p>
Ошибка: статическое утверждение не удалось из -за требования < /p>
< /blockquote>
и в gcc: < /p>
not a a arcmumt ry -indry 'or in reply' ry ant 'brc />
. шаблон
параметр, поэтому объявление «deckval» должно быть доступно < /p>
< /blockquote>
Ссылка на Godbolt < /p>
Подробнее здесь: https://stackoverflow.com/questions/795 ... ng-declval