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

Bab*_*Bab 5 binding traits c++17

我有一些简单的 C++ 代码(g++ 编译器),其中std::is_sametrait 给出了(在我看来)一个奇怪的(意外的)结果: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!
Run Code Online (Sandbox Code Playgroud)

Dei*_*Dei 4

来自cppreference关于decltype

如果参数是命名结构化绑定的不带括号的id 表达式,则 decltype 生成引用类型 (在结构化绑定声明的规范中描述)。

在你的情况下,事实上decltype是罪魁祸首,而不是结构化绑定本身(或者我猜他们是同谋)。因此,您希望decltype((nn))自己static_assert能够成功。