gpt4 book ai didi

c++ - 为什么返回类型中的 decltype 表达式必须在符号名称中被破坏?

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

我最近发现 decltype 表达式在用作返回类型时作为函数符号名称的一部分被破坏,这可能是在分解表达式时(例如在调试 session 中)出现严重段错误的原因,如果表达式太复杂。

第一个版本,在函数返回类型中使用 decltype,其中完整的表达式被破坏(http://goo.gl/EALubx):

#include <cstdint>
#include <utility>

struct A { void bar() const; };

template<typename T>
decltype(std::declval<T>().bar()) foo(T const& a);

void foo() { A a; return foo(a); }

编译为 (GCC 5.2.0):

foo():
sub rsp, 24
lea rdi, [rsp+15]
call decltype ((((declval<A>)()).bar)()) foo<A>(A const&)
add rsp, 24
ret

第二个版本,几乎等价,其中表达式类型作为附加模板参数 (http://goo.gl/DfQGR5) 的一部分解析:

#include <cstdint>
#include <utility>

struct A { void bar() const; };

template<typename T, typename R=decltype(std::declval<T>().bar())>
R foo(T const& a);

void foo() { A a; return foo(a); }

编译为 (GCC 5.2.0):

foo():
sub rsp, 24
lea rdi, [rsp+15]
call void foo<A, void>(A const&)
add rsp, 24
ret

我知道模板函数只能在它们的返回类型上重载,但编译器不应该能够自己解析 decltype 表达式并破坏结果类型吗?

谁能告诉我原因,或者指出它在 C++ 规范中的哪个位置指定?

最佳答案

回答:

正如 T.C. 所解释的那样在评论中,原因在于模板函数重载规则 [temp.over.link]/5-6

例如:

// #1
template<typename T>
decltype(std::declval<T>().bar()) foo(T const& a);

// #2 same function as #1, because both are "equivalent":
// declared in the same scope, with the same name and
// argument/return type expressions are "equivalent"
template<typename U>
decltype(std::declval<U>().bar()) foo(U const& a);

// #3 overloads #1, because argument/return type expressions
// may not be resolved to the same value for any given set of T
template<typename T>
decltype(std::declval<T>().baz()) foo(T const& a);

这也意味着以下格式错误:

// #1
template<typename T>
decltype(std::declval<T>().bar(2)) foo(T const& a);

// #2 is "functionally equivalent" but not "equivalent" to #1
// because argument/return type expressions are not "equivalent"
// but "functionally equivalent": they are resolved to the same value
// for any given T
template<typename T>
decltype(std::declval<T>().bar(1+1)) foo(T const& a);

关于c++ - 为什么返回类型中的 decltype 表达式必须在符号名称中被破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34638587/

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