gpt4 book ai didi

c++ - 使用 -pedantic 编译时采用 std::reference_wrapper 的模糊构造函数

转载 作者:可可西里 更新时间:2023-11-01 17:58:11 37 4
gpt4 key购买 nike

我有一个带有复制构造函数和采用 std::reference_wrapper 的构造函数的类:

#include <functional>
#include <iostream>

class Class {
public:
Class() {
std::cout << "Class()" << std::endl;
}
Class(Class const &) {
std::cout << "Class(Class const &)" << std::endl;
}
Class(std::reference_wrapper<Class>) {
std::cout << "Class(std::reference_wrapper<Class>)" << std::endl;
}
Class(std::reference_wrapper<const Class>) {
std::cout << "Class(std::reference_wrapper<const Class>)" << std::endl;
}
};

int main() {
Class a;
Class b = a;
Class c = std::ref(a);
Class d = std::cref(a);
}

正常编译时 (g++ --std=c++17 test.cpp) 这会按预期工作,依次调用四个构造函数:

$ ./a.exe
Class()
Class(Class const &)
Class(std::reference_wrapper<Class>)
Class(std::reference_wrapper<const Class>)

但是,使用 -pedantic(即 g++ --std=c++17 -pedantic test.cpp)编译会导致以下错误(以及另一个等效错误一个用于 std::cref):

test.cpp:23:22: error: conversion from 'std::reference_wrapper<Class>' to 'Class' is ambiguous
Class c = std::ref(a);
^
note: candidate: std::reference_wrapper<_Tp>::operator _Tp&() const [with _Tp = Class]
note: candidate: Class::Class(std::reference_wrapper<Class>)

这是为什么(即,我如何违反标准,在 Conversion constructor vs. conversion operator: precedence 中回答),我如何在没有 -pedantic 的情况下以符合标准的方式实现结果?

$ g++ --version
g++.exe (Rev1, Built by MSYS2 project) 7.2.0

最佳答案

how do I achieve the result without -pedantic in a standard-conforming manner?

在您的情况下,创建完全匹配的重载:

Class(std::reference_wrapper<Class>&&) {
std::cout << "Class(std::reference_wrapper<Class>)" << std::endl;
}
Class(std::reference_wrapper<const Class>&&) {
std::cout << "Class(std::reference_wrapper<const Class>)" << std::endl;
}

Demo

关于c++ - 使用 -pedantic 编译时采用 std::reference_wrapper 的模糊构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50137200/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com