【问题标题】:What does contain mean in [dcl.constexpr]/3[dcl.constexpr]/3 中包含什么意思
【发布时间】:2015-10-16 00:44:28
【问题描述】:

在 [dcl.constexpr]/3 (http://eel.is/c++draft/dcl.constexpr#3) 中,“或不包含的复合语句”中的包含是什么意思? p>

例如:

constexpr int f(bool b) {
     return b ? ([]() { goto x; x: return 1; })() : 2;
}

int main() {}

构成f:s 正文的复合语句不包含goto 语句吗?

对于该示例,我没有收到来自 Clang 或 GCC 的错误消息。

【问题讨论】:

  • @T.C.那么constexpr int f() { { goto lbl; } lbl: return 7; } 可以吗?我测试的任何编译器都不接受它。
  • constexpr int f() { { goto lbl; } lbl:返回 7; } 不好,包含它们似乎甚至是间接的。在我的例子中,这似乎过于间接了。
  • 是的,看起来确实不太好,这就是我的观点:简单的答案(它的意思是“直接包含”)似乎不正确,所以你的问题仍然存在。啊,我刚刚看到你自己在std-discussion 上提出了这个问题。看来我们达成了一致。

标签: c++ lambda language-lawyer c++14 constexpr


【解决方案1】:

如果您尝试在constexpr 上下文中使用此函数,您将收到相应的错误:

constexpr int f(bool b) {
     return b ? ([]() { goto x; x: return 1; })() : 2;
}

int main() {
    static_assert(f(true)==2, "");    
}

非文字类型 'const (lambda at main.cpp:2:18)' 不能用于 常量表达式

消除 lambda 但保留 goto 也会报错:

constexpr int g() { goto x; x : return 1; }

constexpr int f(bool b) {
     return b ? g() : 2;
}

int main() {
    static_assert(f(true)==2, "");    
}
main.cpp:1:21: error: statement not allowed in constexpr function
constexpr int g() { goto x; x : return 1; }
                    ^

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    相关资源
    最近更新 更多