我编写了下面的类,它有一个条件成员_s
和worksOnlyForString
访问该成员的方法std::string
。如果worksOnlyForString
没有调用方法,即使成员不是,代码也会编译std::string
。
有一个众所周知的 c++ 规则——模板函数只有在使用时才会被完全编译。但就我而言,条件成员触发了这种行为。
问题是 - 为什么代码编译。
#include <iostream>
#include <string>
#include <type_traits>
template<bool isString>
struct S
{
void worksAlways()
{
std::cout << _s;
}
// compiles for isString == false. (if not used)
// but why
void worksOnlyForString()
{
std::cout<<_s.size();
}
std::conditional_t<isString, std::string, int> _s;
#if 0
//this part does not compile and it is expected and ok
void checkUnconditionalMember()
{
std::cout<<_i.size();
}
int _i;
#endif
};
int main()
{
S<true> s;
s._s = "xxx";
s.worksOnlyForString(); // ok prints "3"
S<false> s1; // why does this line compile ?
s1._s = 99;
s1.worksAlways(); // ok prints "99"
return 0;
}