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)
来自cppreference关于decltype:
如果参数是命名结构化绑定的不带括号的id 表达式,则 decltype 生成引用类型 (在结构化绑定声明的规范中描述)。
在你的情况下,事实上decltype是罪魁祸首,而不是结构化绑定本身(或者我猜他们是同谋)。因此,您希望decltype((nn))自己static_assert能够成功。
| 归档时间: |
|
| 查看次数: |
53 次 |
| 最近记录: |