gpt4 book ai didi

c++ - constexpr 的推导类型是什么?

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

#include <iostream>
#include <string>

void foo(int& k) { std::cout << "int&\n"; }
void foo(int&& k) { std::cout << "int&&\n"; }
void foo(const int& k) { std::cout << "const int&\n"; }
void foo(const int&& k) { std::cout << "const int&&\n"; }
int main() {
static constexpr int k = 1;
foo(k);
foo(1);
}

输出是:

const int&
int&&

constexpr 变量究竟被视为什么?foo 的重载给出了 const int&

编辑:继续将 constexpr 推导为 const T&;

为什么类范围内的 constexpr 无法传递给采用通用引用的函数?!

#include <type_traits>

template <typename T>
void goo(T&& k) {
static_assert(std::is_same<decltype(k), const int&>::value, "k is const int&");
}

class F {
static constexpr int k = 1;
public:
void kk2 () { goo(k); }
};

int main () {
F a;
a.kk2();
}

以上编译失败给出错误 undefined reference to F::k但是以下通过:

#include <type_traits>

template <typename T>
void goo(T&& k) {
static_assert(std::is_same<decltype(k), const int&>::value, "k is const int&");
}

int main() {
static constexpr int k = 1;
goo(k);
}

最佳答案

N3337 [dcl.constexpr]/9: A constexpr specifier used in an object declaration declares the object as const. [...]

由于您将 k 声明为 constexpr,它也被声明为 const,因此 const int& 是在过载决议中选择。

关于c++ - constexpr 的推导类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40176585/

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