除了语义和语法,程序是否还有其他级别可以正确或不正确?这与 SFINAE 有何关系?

问题描述

tl;博士

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

  • 哦,很明显它失败了,第 5 行有语法错误
  • 嗯,看,我认为在第 10 行和第 13 行之间有一个语义错误
  • 不,您不能调用变量 a±b,这是一个词法错误
  • 在第 50 行有一个 X 错误,对于语义句法之外的任何X类型的错误

原始问题

添加 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 有何关联?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)