指针、引用和常量引用参数的函数调用歧义

2024-01-11

我想做的是,允许使用 setter 函数传递指针、引用或常量引用:

class A{
    std::string * p;
    std::string st;

    public:
    A():p(0)
    {}
    A& setS(const std::string& s){
        std::cout<<"called with const std::string&\n";
        st = s;
        p = &st;
        return *this;
    }
    A& setS(std::string& s) {
        std::cout<<"called with std::string&\n";
        p = &s;
        return *this; 
    }
    A& setS(std::string* s) {
        std::cout<<"called with std::string*\n";
        p = s;
        return *this; 
    }
};

int main(){
   std::string s;
   A a;
   a.setS(std::move(s)) //const std::string&
    .setS("")           //const std::string&
    .setS(s)            //std::string&
    .setS(0);           //std::string*
    //if std::string* version is not defined,
    //setS(0) calls the const std::string& version and throws exception 
    return 0;
}

但我已经看到,如果指针版本不存在,setS(0)称为const std::string&的版本setS()功能。

指针和参考版本之间或其他重要版本之间是否存在歧义?它是否定义良好并期望在所有编译器中以相同的方式工作?


没有任何歧义。当你有A& setS(std::string* s)然后在过载集中setS(0)调用指针版本并0是一个空指针。这相当于setS(nullptr).

When A& setS(std::string* s)不在重载集中,那么编译器会查看是否有办法可以从中构造临时字符串0然后将其传递给A& setS(const std::string& s)自从一个const&可以绑定到临时的。std::string可以从单个指针构造并再次构造0它作为空指针运行。所以你得到了一个临时的空指针构造std::string传递给const&功能。

但这是未定义的行为。构造函数为std::string要求传递给它的指针是一个以 null 结尾的 c 字符串。如果不是,则行为未定义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

指针、引用和常量引用参数的函数调用歧义 的相关文章

随机推荐

  • 由于上下文丢失,WebGL 场景无法渲染

    我有一个带纹理和不带纹理的道路 3D 模型 当我加载没有纹理的道路时 一切正常 60fps 但是当我加载带有纹理的道路时 有两种变体 1 如果 3D 模型不大 那么它可以加载并工作 但 fps 非常低 10 20 2 如果 3D 模型很大
  • PDO 语句比 MySQL CLI 花费的时间长 400 倍 [重复]

    这个问题在这里已经有答案了 我正在运行一个 PDO 准备语句来从大约 6k 行的表中进行选择 由于 WHERE 语句具有约 5k pId 因此该特定查询最终返回所有行 该表在 pId 列上也有一个索引 SELECT FROM table a
  • 如何让 geom_text 与 ggplot2 左对齐

    我想左对齐geom text层与ggplot2 我正在使用以下代码 library tidyverse library hydroGOF library scales summ lt df gt group by Date gt summa
  • Selenium 2 StaleElementReferenceException 将 DropDownList 与 AutoPostBack 与 InternetExplorerDriver 一起使用时

    我正在使用 Selenium 2 使用 InternetExplorerDriver 测试 asp net Web 表单页面 并且遇到 StaleElementReferenceException 该页面包含一个 自动回发 下拉列表 我从中
  • 用千分尺查询数据

    我们有这个奇特的监控系统 我们的 spring boot 服务通过千分尺将指标发布到流入数据库 有一个不错的 grafana 前端 但问题是我们现在处于这样一个阶段 我们必须在其他服务中提供其中一些指标来进行推理 整个体系是我的前任建立的
  • Android 中将值从一个 Activity 传递到另一个 Activity

    您好 我开发了一个应用程序 它有一个文本框和一个搜索按钮 当我在文本框中输入数字并单击搜索按钮时 它需要将输入的值传递到下一个活动 在下一个活动中使用该值来获取值来自数据库 我正在使用以下代码来传递值 search button setCl
  • 字段“$name”必须是累加器对象

    我有一个疑问 当我使用 group https docs mongodb com manual reference operator aggregation group 错误显示 字段 name 必须是累加器对象 如果删除提交的 name
  • RESTful 服务:WCF 与 ASP.NET MVC

    实现 RESTful 服务的一种非常常见的方法是利用 ASP NET MVC 通过 WCF 来实现 ASP NET MVC 通过灵活的 URL 路由和灵活的 HTTP 方法映射到控制器操作 具有出色的 RESTful 支持 WCF 4 0
  • 如何将 Pigz 与 Tar 一起使用

    所以我在 tar 中使用 Pigz tar use compress program pigz 这可行 但它没有使用我的所有处理器 我想确保它是递归的 r 并使用 9 压缩级别 我通读了利用多核进行tar gzip bzip压缩 解压 ht
  • 使用 git 进行贡献

    所以我在github上克隆了一个项目并修复了补丁 因为这是我第一次使用 git 工作 所以我试图找出将其放到网上的最佳方法 在 github 上查看我自己的 克隆的 存储库后 发现只有一个分支 master 我创建了一个分支 myfix 现
  • 如何使用 Bash 伪造 DHCP 发现数据包?

    我想通过网络 LAN 发送经典DHCP 发现使用命令行打包 以便触发来自任何DHCP服务器监听 所以我可以用类似的东西捕获它 假设我的IP地址是192 168 0 30 tcpdump i eth0 host 192 168 0 30 n
  • 在 `aws cloudformation deploy --parameter-overrides` 中,如何将多个值传递给 `List` 参数?

    我在用这个 CloudFormation 模板 https docs aws amazon com AWSCloudFormation latest UserGuide example templates autoscaling html
  • 类型“未定义”不可分配给类型“从不”

    interface A name string age number var a A name age 23 var result A Object keys a as Array
  • 总结 sf::st_intersection() 中几何图形重叠的属性

    我想总结一组几何图形的属性 对它们重叠的值进行求和 library devtools install github r spatial sf library sf m rbind c 0 0 c 1 0 c 1 1 c 0 1 c 0 0
  • 如何查看Tortoise HG发出的Mercurial命令?

    我有办法查看 Tortoise HG 发出了哪些 Mercurial 命令吗 例如 如果我在 Tortoise 中使用 Shelve 命令 我想看看它如何 以及是否 在幕后调用 hg shelve 在某些工具中 有一个 查看 gt 始终显示
  • GCP 实例可以使用单个网络接口的最大带宽是多少?

    我正在使用 n 个并行进程将数据上传到 Google 云存储桶 出口数据速率约为 16Gbps 仅使用 n 个进程并行从 gcp 存储桶下载数据时 入口流量约为 26Gbps 但是当我使用相同的编号同时执行上传和下载时 的进程 入口速率降低
  • Java 方法引用具有泛型参数的方法

    我正在尝试对具有在类声明中指定的通用参数的方法进行方法引用 所以我有 public interface IExecutable p void execute P parameter public class Parameter implem
  • Android - 在运行时更改片段布局

    我想在我的应用程序中实现单活动多片段设计 我计划有几个 屏幕 片段的布局 我将在代码中切换 可能添加到后台堆栈 据我了解 每个屏幕中片段的布局是使用布局对象 例如 FrameLayout 设置的 该对象充当片段的占位符 共享相同的 ID 由
  • Spring 拦截 url 模式

    Spring Security 拦截 url 模式与 path 或 path 有什么区别 我见过一些具有以下内容的 Spring 安全配置 但我不明白 与 The vs 现在框架中很常见 通常称为Apache Ant Pathing或类似的
  • 指针、引用和常量引用参数的函数调用歧义

    我想做的是 允许使用 setter 函数传递指针 引用或常量引用 class A std string p std string st public A p 0 A setS const std string s std cout lt l