0

我编写了下面的类,它有一个条件成员_sworksOnlyForString访问该成员的方法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;
}
4

1 回答 1

2

以下代码与名称无关,因此编译器会发现错误。

void checkUnconditionalMember()
{
    std::cout<<_i.size();
}

std::conditional_t<isString, std::string, int> _s;

void worksOnlyForString()
{
    std::cout << _s.size();
}
  • _s是名称相关的(取决于isString)。
  • 等等std::cout << _s.size();

所以只有在函数被实例化时才会进行全面检查。

实例化类不会实例化每个方法。

于 2018-10-25T13:38:43.583 回答