我有一些简单的C ++代码(g ++编译器),其中std::is_same
特性给我带来了奇怪的(意想不到的)结果:static_assert
以下:
class Person {
public:
const std::string _given_name;
const std::string _surname;
std::string _nickname;
Person(const std::string& given_name, const std::string& surname, const std::string& nickname)
: _given_name(given_name), _surname(surname), _nickname(nickname) {
}
};
Person p("Donald", "Duck", "?");
auto& [gn, sn, nn] = p; // C++17 binding
nn = "Blondie";
std::cout << p._nickname << std::endl; // 'Blondie'
static_assert(std::is_same<decltype(nn), std::string&>::value); // Fails!
static_assert(std::is_same<decltype(nn), std::string>::value); // Succeeds!
从cppreference到decltype
:
如果参数是unparenthesized id表达式,则命名为结构化绑定,然后decltype产生引用的类型(在结构化绑定的规范中进行了描述声明)。
实际上,decltype
是罪魁祸首,而不是结构化绑定。因此,您希望decltype((nn))
成功。