gpt4 book ai didi

C++更改构造函数中的函数解析优先级

转载 作者:行者123 更新时间:2023-11-30 05:40:45 33 4
gpt4 key购买 nike

考虑以下代码:

#include <cstdio>
#include <initializer_list>

using namespace std;

class A {
public:
A(const char*, void*) { printf("const char*, void*\n"); }; // #1
A(initializer_list<char*>) { printf("initializer_list<char*>\n"); }; // #2
};

void F(const A&) {};

int main(int, char**) {
F({ "A", new char[256]() });
};

我有一个函数 F我可以用任何参数调用 is_constructibleclass A .

如果我运行该程序,我会看到构造函数 #2 被调用,并且我会收到如下警告:ISO C++11 does not allow conversion from string literal to 'char *const'对于第一个参数。 C++ 自动将此参数从字符串文字转换为 char*。为了使调用匹配签名 initializer_list<char*> .

但编译器也可以尝试将第二个参数转换为 void*以便调用与签名匹配 const char*, void*相反。

这两个调用从调用到“匹配签名”采取“相同数量的步骤”,但出于某种原因,编译器选择了后者。

我想了解这个选择背后的基本原理是什么,以及是否有任何机会“提示”编译器在第一个参数是字符串文字时使用构造函数#1。

从大局来看,

我想要这样的电话:F({ "A", new char[256]() })选择构造函数#1,

但像F({ (char*)"A", new char[256]() })这样的电话选择构造函数 #2。

编译器细节:Apple LLVM 版本 6.0 (clang-600.0.57)(基于 LLVM 3.5svn)目标:x86_64-apple-darwin14.1.0线程模型:posix

最佳答案

像#2 这样的初始化列表构造函数优先于其他构造函数。只要它是一个可行的构造函数,那么尽管有一个可能更可行的非初始化列表构造函数,它们也会被考虑。字符串文字是 N const char 的数组,从字符串文字到 char* 的转换是 C 的遗留问题,但自 C++ 以来已被弃用03.

由于无论如何都可能发生转换,因此仍使用构造函数而不是#1。您可以通过将其转换为非文字(即从函数返回)来阻止此转换:

const char* operator"" _strong(const char* str, std::size_t) {
return str;
}

int main() {
F({ "A", new char[256]() }); // #1
F({ "A"_strong, new char[256]() }); // #2
}

现在到 char* 的转换将失败,然后重载解析将 #1 视为候选构造函数。

关于C++更改构造函数中的函数解析优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31484101/

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