首页 > 解决方案 > 除了语义和句法之外,程序是否有任何其他级别可以正确或不正确?这与 SFINAE 有何关系?

问题描述

tl;博士

我想了解我可以对非工作代码发表以下评论的逻辑:

原始问题

我添加 C++ 是因为我使用了该语言的示例,以及language-lawyer标记以防答案取决于语言,即使我的问题更笼统。

如果我用 C++ 编写这段代码,

x x x;

它不会编译时出现这样的错误

$ g++ -std=c++17 uffa.cpp && ./a.out 
uffa.cpp: In function ‘int main()’:
uffa.cpp:4:6: error: expected ‘;’ before ‘x’
    4 |     x x x;
      |      ^~
      |      ;

我的理解是这x x x;在语法上是错误的。病态是一个更好的术语?还是语法错误?

另一方面,编码这个

    s.append("!");

可以是有效的,例如如果它前面是std::string s{"Ciao"};,或者是无效的,例如如果前面是int s{3};,在后一种情况下,错误是这样的

$ g++ -std=c++17 uffa.cpp && ./a.out 
uffa.cpp: In function ‘int main()’:
uffa.cpp:5:7: error: request for member ‘append’ in ‘s’, which is of non-class type ‘int’
    5 |     s.append("!");
      |       ^~~~~~

尽管错误具有相同的“形状”,但我的理解是,后一个错误与代码在与第一个示例不同的“级别”上无效有关。它在语义上是否无效/不正确/格式错误

这种错误的“分类”与 SFINAE 和if constexpr?

标签: c++syntaxlanguage-lawyersemanticssfinae

解决方案


推荐阅读