std :: is_same在使用C ++ 17结构化绑定时给出奇怪的结果

问题描述 投票:3回答:1

我有一些简单的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!
binding c++17 traits
1个回答
0
投票

cppreferencedecltype

如果参数是unparenthesized id表达式,则命名为结构化绑定,然后decltype产生引用的类型(在结构化绑定的规范中进行了描述声明)。

实际上,decltype是罪魁祸首,而不是结构化绑定。因此,您希望decltype((nn))成功。

© www.soinside.com 2019 - 2024. All rights reserved.