gpt4 book ai didi

c++ - operator[] 作为成员函数的正确模板参数/参数是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 02:03:03 25 4
gpt4 key购买 nike

在尝试调用接受类型和该类型的参数/实参作为模板形参/实参的函数模板时,编译器会给出一个错误,该错误不是由类似的形参/实参产生的。所以我想知道在调用 vector 类的成员函数“operator[]const”的函数模板时正确的参数/参数是什么!

考虑这段代码:

class test_class{
public:
int member;
int& operator[](size_t) {return member;}
const int& operator[](size_t) const{return member;}
};
typedef std::vector<int> vector_type;

typedef const int&(test_class::* OK_type)(size_t)const;
typedef const int&(vector_type::* not_OK_type)(size_t)const;

static constexpr OK_type OK_pointer = &test_class::operator[];
static constexpr not_OK_type not_OK_pointer = &vector_type::operator[];

template<typename t__, t__>
void function(){}

上面的代码没问题,现在考虑主要功能:

int main() {
function<OK_type, OK_pointer>();
function<not_OK_type, not_OK_pointer>();
return 0;
}

第一次调用函数模板可以,但第二次不行。编译器产生的错误是:

error: no matching function for call to ‘function<not_OK_type, not_OK_pointer>()’
note: candidate: ‘template<class t__, t__ <anonymous> > void function()’
note: template argument deduction/substitution failed:
error: ‘const int& (std::vector<int>::*)(size_t) const{((const int& (std::vector<int>::*)(size_t) const)std::vector<int>::operator[]), 0}’ is not a valid template argument for type ‘const int& (std::vector<int>::*)(long unsigned int) const’
function<not_OK_type, not_OK_pointer>();
note: it must be a pointer-to-member of the form ‘&X::Y’

有趣的是,即使函数模板形成为:

template<auto>
void function(){}

它会导致相同的结果。

我必须补充一点,在非 const 版本的情况下,错误是相同的(对于 std::vector)。

所以我想知道

阿:怎么了?

B:考虑到如果 not_OK_type&vector_type::operator[] 不匹配,那么编译器也会在以下情况下给出错误:

static constexpr not_OK_type not_OK_pointer = &vector_type::operator[];

可用作 constexpr 的类型与可用作模板参数/实参的类型有区别吗?

最佳答案

问题是 typedef const int&(vector_type::* not_OK_type)(size_t)const;

如果您看到 STL_vector.h ( here ),operator[] 在第 1040 行被声明为 noexcept

但是在not_OK_type 变量的声明中,noexcept 是不存在的。这就是编译器提示的原因。

为了消除编译错误,将noexcept 添加到not_OK_type 变量。像这样:

typedef const int&(vector_type::* not_OK_type)(size_t)const noexcept;

工作代码:

#include <vector>

class test_class{
public:
int member;
int& operator[](size_t) {return member;}
const int& operator[](size_t) const{return member;}
};
typedef std::vector<int> vector_type;

typedef const int&(test_class::* OK_type)(size_t)const;
typedef const int&(vector_type::* not_OK_type)(size_t)const noexcept;

static constexpr OK_type OK_pointer = &test_class::operator[];
static constexpr not_OK_type not_OK_pointer = &vector_type::operator[];

template<typename t__, t__>
void function(){}

int main() {
function<OK_type, OK_pointer>();
function<not_OK_type, not_OK_pointer>();
return 0;
}

关于c++ - operator[] 作为成员函数的正确模板参数/参数是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56070755/

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