gpt4 book ai didi

c++ - std::is_arithmetic 为泛型 lambda 中的 int 类型返回 false:未定义的行为?

转载 作者:太空狗 更新时间:2023-10-29 20:35:32 24 4
gpt4 key购买 nike

考虑:

#include <iostream>
#include <typeinfo>
#include <type_traits>

#include <cxxabi.h>

#include <boost/hana.hpp>
namespace hana = boost::hana;

struct Person {
BOOST_HANA_DEFINE_STRUCT(Person,
(std::string, name),
(int, age)
);
};

template<typename T>
void stringify(const T& v) {
hana::for_each(hana::accessors<T>(), [&v](auto a) {
// Here I'm printing the demangled type, just to make sure it is actually the type I'm thinking it is.
std::cout << abi::__cxa_demangle(typeid(decltype(hana::second(a)(v)){}).name(), 0, 0, 0);

// If the value is arithmetic, "quote" should be an empty string. Else, it should be an actual quote.
// UNEXPECTED BEHAVIOR IS HERE
std::string quote{(std::is_arithmetic<decltype(hana::second(a)(v))>::value?"":"\"")};

// Finally do what we're here for.
std::cout << " " << hana::first(a).c_str() << " = " << quote << hana::second(a)(v) << quote << "\n";
});
}

int main() {
Person john;
john.name = "John Doe";
john.age = 42;
stringify(john);
}

See it live

输出:

std::__cxx11::basic_string</*...*/> name = "John Doe"
int age = "42"

我正在尝试使用 std::is_arithmetic 来判断我是否正在处理数字而不是其他一些非算术类型,并相应地打印(或不打印)引号。

但出于某种原因,“返回”的值(通过 ::value 成员)是 false,即使我传递的是 int(我通过首先使用 gcc 的 cxxabi.h 打印 demangled 类型来确保我这样做是正确的)

正如您从输出中看到的那样,这会导致 int 打印带有引号。

我的问题是:为什么返回 false?这与通用 lambda 有什么关系吗?我可以修复它吗?

我实际上是直接在 Coliru 上测试这个,因此您可以假定那里使用的任何 gcc 版本(当前为 6.3.0)。

最佳答案

你的问题是尽管 type typeid returns (int) 您在 lambda 中的实际类型是 int const& 并且 is_arithmetic 不专门用于该确切类型。 You can get the type you actually want with std::decay or a combination of std::remove_const and std::remove_reference .

关于c++ - std::is_arithmetic 为泛型 lambda 中的 int 类型返回 false:未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42448671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com