作者WangDaMing (王大明)
看板C_and_CPP
标题[问题] constexpr作用
时间Thu Jun 17 18:49:18 2021
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
GCC
最近再努力看懂rvalue相关的东西,看到一篇文章
有个人写了is_lvalue他本来没加"constexpr"可是有人建议他补上
他後来也补上了~想请问这个会有什麽差别嘛??
我看这好像看反编译的结果好像也不能再编译期就知道结果?
想问真的有加上的必要嘛??
https://reurl.cc/mLl5Wl
#include <iostream>
template <typename T>
constexpr bool is_lvalue(T&) {
return true;
}
template <typename T>
constexpr bool is_lvalue(T&&) {
return false;
}
int main()
{
std::string a = std::string("Hello");
std::cout << "Is lValue ? " << '\n';
std::cout << "std::string() : " << is_lvalue(std::string()) << '\n';
std::cout << "a : " << is_lvalue(a) << '\n';
std::cout << "a+b : " << is_lvalue(a+ std::string(" world!!! ")) << '\n';
}
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 39.13.128.208 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1623926961.A.965.html
1F:→ oToToT: 有开 O1 以上的话看起来就有被 evaluate 掉,不过 O1 的时 06/17 19:18
2F:→ oToToT: 好像不加 constexpr 在这个 case 他也会省略掉 06/17 19:18
3F:推 KanzakiHAria: conextpr是编译时期决定 值不是在动态时期才给的 06/17 19:19
4F:→ KanzakiHAria: 你反编译确定哪一段是哪一行吗 06/17 19:23
5F:→ WangDaMing: 不开最佳化应该要有差别可是我看不出来要不要加的差别 06/17 19:42
6F:→ KanzakiHAria: 这个是C++规格阿 跟编译器优化等级无关 06/17 22:58
7F:推 LPH66: 标 constexpr 的函数若参数也都是 constexpr 的话 06/17 23:07
8F:→ LPH66: 这样子的呼叫可以用在文法其他地方需要 constexpr 值的位置 06/17 23:08
9F:→ LPH66: 例如这里回传的 bool 能放在模版参数里需要一个 bool 之处 06/17 23:09
10F:→ LPH66: 至於这个 bool 值如果是执行期呼叫, 那是否 inline 或化简 06/17 23:10
11F:→ LPH66: 仍然是交给编译器决定, 并没有强迫一定要展开 06/17 23:10
12F:推 steve1012: 你给的范例code里面string 不是literal type 06/18 05:32