Most vexing parse(最烦人的解析)

2024-01-09 20:58
文章标签 解析 parse 烦人 vexing

本文主要是介绍Most vexing parse(最烦人的解析),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Most vexing parse(最烦人的解析)

  • 引言
  • 错误的方式
  • Most vexing parse 解释
    • 证明
  • 如何避免

引言

Most vexing parse 是 effective c++ 书中写到的,写本文是为了讲清这到底是什么.

错误的方式

#include <iostream>
class A {  public:A(const std::string& name){std::cout << name << std::endl;}
};int main()  
{char szTemp[] = "test";A a(std::string(szTemp));//A a(std::string())//同样没有输出return 0;
}

上面写了一个简单的类,构造函数允许传入一个string类型的引用,然后输出。
main函数中我们的本意是创建一个A类型的对象,并且传入szTemp的string,让其在构造函数中输出
但是却发现什么也没有输出,这是什么原因呢?

Most vexing parse 解释

在C++中,如果出现 T1 t1Name(T2(t2Name)),C++会将它解释成T1 t1Name(T2 t2Name)函数声明。

拿上面弄得栗子讲:
A a(std::string(szTemp))
被解释成了 A a(std::string szTemp)的函数声明。

如果我们将A a(std::string(szTemp))替换成A a(std::string("test")),或者将A a(std::string())替换成A a(std::string(""))就不会有任何问题。

证明

通过打印 std::cout << typeid(a).name(); 可以发现类型根本不是class a,而是一个function.
下面的代码我们将A a(std::string(szTemp))真正定义出来。

#include <iostream>
class A {  public:A(const std::string& name){std::cout << name << std::endl;}
};char szTemp[] = "test";A a(std::string(szTemp)){//这里的szTemp并不是全局变量的szTemp//而是函数形参,还记得上面说过//被解释成了 A a(string szTemp)std::cout << szTemp + " 新的输出" << std::endl;return A(szTemp); 
}int main()  
{//这里的a是function,会返回一个A类型的对象//所以不存在T1 t1name,T2 t2name 同时出现的问题。这是一个赋值语句。char test[]="haha";A obj = a(std::string(test));return 0;
}

输出结果:
test 新的输出
test

如何避免

使用C++的方式来传参。

  1. A a{ std::string(szTemp) };
  1. 先创建string字符串
    std::string str(szTemp) ;
    A a(str);
  1. 直接使用常量
    A a(std::string(“test”) );
    这样仅仅是T1 t1name(T2(常量))

只要避免T1 t1name T2 t2name 同时出现即可。

这篇关于Most vexing parse(最烦人的解析)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/588404

相关文章

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

Spring Boot 3.x 中 WebClient 示例详解析

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET... 目录Spring Boot 3.x 中 WebClient 全面详解及示例1. WebClient 简介2.

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应