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

相关文章

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

springboot项目中使用JOSN解析库的方法

《springboot项目中使用JOSN解析库的方法》JSON,全程是JavaScriptObjectNotation,是一种轻量级的数据交换格式,本文给大家介绍springboot项目中使用JOSN... 目录一、jsON解析简介二、Spring Boot项目中使用JSON解析1、pom.XML文件引入依

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

Mybatis Plus JSqlParser解析sql语句及JSqlParser安装步骤

《MybatisPlusJSqlParser解析sql语句及JSqlParser安装步骤》JSqlParser是一个用于解析SQL语句的Java库,它可以将SQL语句解析为一个Java对象树,允许... 目录【一】jsqlParser 是什么【二】JSqlParser 的安装步骤【三】使用场景【1】sql语

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Java 关键字transient与注解@Transient的区别用途解析

《Java关键字transient与注解@Transient的区别用途解析》在Java中,transient是一个关键字,用于声明一个字段不会被序列化,这篇文章给大家介绍了Java关键字transi... 在Java中,transient 是一个关键字,用于声明一个字段不会被序列化。当一个对象被序列化时,被

Java JSQLParser解析SQL的使用指南

《JavaJSQLParser解析SQL的使用指南》JSQLParser是一个Java语言的SQL语句解析工具,可以将SQL语句解析成为Java类的层次结构,还支持改写SQL,下面我们就来看看它的具... 目录一、引言二、jsQLParser常见类2.1 Class Diagram2.2 Statement

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三