与朋友 class 不同的两个 classes 声明是否构成 ODR 违规?
Do two classes declarations differing from a friend class make an ODR violation?
考虑a.hpp
class foo{
int c;
};
和b.hpp
class bar;
class foo{
friend bar;
// from here identical to a.hpp
int c;
};
严格来说,这是否违反 ODR?
是的。 ODR 很清楚,来自 cppreference(强调我的):
There can be more than one definition in a program of each of the following: class type, [...], as long as all of the following is true:
- [... some other points...]
- each definition consists of the same sequence of tokens [...]
- [...]
class foo
定义中的第一个标记 b.hpp
中的“friend
”标记不同于 class 中的“int
”标记] foo
a.hpp
中的定义——这就足够了。请注意这一点有多么严格——它谈论的是 令牌 ,甚至没有讨论这些令牌的含义(但请注意还有其他点有进一步的限制)。如果这两个头文件打算用于将要链接在一起的两个翻译单元,则违反了 ODR。
考虑a.hpp
class foo{
int c;
};
和b.hpp
class bar;
class foo{
friend bar;
// from here identical to a.hpp
int c;
};
严格来说,这是否违反 ODR?
是的。 ODR 很清楚,来自 cppreference(强调我的):
There can be more than one definition in a program of each of the following: class type, [...], as long as all of the following is true:
- [... some other points...]
- each definition consists of the same sequence of tokens [...]
- [...]
class foo
定义中的第一个标记 b.hpp
中的“friend
”标记不同于 class 中的“int
”标记] foo
a.hpp
中的定义——这就足够了。请注意这一点有多么严格——它谈论的是 令牌 ,甚至没有讨论这些令牌的含义(但请注意还有其他点有进一步的限制)。如果这两个头文件打算用于将要链接在一起的两个翻译单元,则违反了 ODR。