std::is#u same在使用C+时会产生奇怪的结果+;17结构化绑定 我有一些简单的C++代码(g++编译器),其中 STD::ISSUME相同< /COD>特性给出(在我看来)一个奇怪的(意想不到的)结果: StistalyAsSturt< /C> >下面: 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! 班级人员{ 公众: 常量std::字符串_给定名称; 常量std::字符串_姓氏; std::string_昵称; 人员(const std::string和给定名称,const std::string和姓氏,const std::string和昵称) :(姓名),姓(姓),昵称(昵称){ } }; p人(“唐老鸭”、“鸭子”、“?”); 自动&[gn,sn,nn]=p;//C++17绑定 nn=“金发女郎”; std::cout

std::is#u same在使用C+时会产生奇怪的结果+;17结构化绑定 我有一些简单的C++代码(g++编译器),其中 STD::ISSUME相同< /COD>特性给出(在我看来)一个奇怪的(意想不到的)结果: StistalyAsSturt< /C> >下面: 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! 班级人员{ 公众: 常量std::字符串_给定名称; 常量std::字符串_姓氏; std::string_昵称; 人员(const std::string和给定名称,const std::string和姓氏,const std::string和昵称) :(姓名),姓(姓),昵称(昵称){ } }; p人(“唐老鸭”、“鸭子”、“?”); 自动&[gn,sn,nn]=p;//C++17绑定 nn=“金发女郎”; std::cout,binding,c++17,traits,Binding,C++17,Traits,来自aboutdecltype: 如果参数是一个命名为 结构化绑定,然后decltype生成引用类型 (在结构化绑定规范中描述) 声明) 在您的案例中,事实上,decltype是罪魁祸首,而不是结构化绑定本身(或者我猜它们是串通的)。 因此,您希望decltype((nn))使您的static\u断言成功 谢谢你的快速回复。非常清楚。。。不幸的是,C++仍然复杂(如往常一样)……只是另一句话。我理解规则,但是nn实际上是一个参考,因为nn=“Blondie”对p.\u昵称有直接的副作用。我已经在

来自about
decltype

如果参数是一个命名为 结构化绑定,然后decltype生成引用类型 (在结构化绑定规范中描述) 声明)

在您的案例中,事实上,
decltype
是罪魁祸首,而不是结构化绑定本身(或者我猜它们是串通的)。
因此,您希望
decltype((nn))
使您的
static\u断言成功

谢谢你的快速回复。非常清楚。。。不幸的是,C++仍然复杂(如往常一样)……只是另一句话。我理解规则,但是
nn
实际上是一个参考,因为
nn=“Blondie”
p.\u昵称
有直接的副作用。我已经在另一个例子中使用了
decltype((nn))
,所以,同样地,这个规则是不可争论的。尽管如此,尽管有明确的规则,但我想知道为什么C++被设计成“卷曲”。@ Bob C++是用来覆盖疯狂的用例和角落的情况,即使用例非常遥远。我不知道为什么这个特殊的功能是这样设计的,但可能有一个很好的理由。如果语言很简单,它就不会像现在这样有用了。有很多历史,C++也必须携带。@如果你满意,请接受这个答案,以便问题可以被标记为解决。Thnx:)