Martin Sebor wrote:
>
>Eric Lemings wrote:
>>  
>> 
>>> Travis Vitek wrote:
>>>  
>>>
>>> Eric Lemings wrote:
>>>>> Travis Vitek wrote:
>>>>>
>>>>> The tuple is holding the original pointer (not a copy), so I 
>>>>> think you can check the actual pointer here.
>>>>
>>>> True.  But if that assumption became invalid for whatever
>>>> reason, the code above would still work.
>>>>
>>>> Assumptions are bad.  Robustness is good.  :)
>>>
>>> As I see it, the tuple implementation is required to hold a 
>>> copy of an object of the specified type (const char* in this
>>> case). If you don't verify the value held is indeed a copy,
>>> you are not actually verifying the requirements. This is wrong,
>>> and wrong is much worse than bad. :)
>> 
>> Question:
>> 
>> const char* s1 = "string";
>> const char* s2 = "string";
>> // s1 guaranteed to equal s2?
>
>It's unspecified. The compiler is allowed to merge strings.
>It's allowed to even go as far as to point s2 at (s1 + 1)
>in the snippet below:
>
>     const char* s1 = "Xstring";
>     const char* s2 = "string";
>

Just so we're clear, the case that should be happening with tuple is the
following...

  const char* s1 = "string";
  const char* s2 (s1);

  assert (s1 == s2);

The following code works just fine with both the gnu tuple
implementation and ours. I'm not sure why the Brad is seeing the
assertion failure.

  $ cat t.cpp && g++ -std=gnu++0x t.cpp && ./a.out && echo good
  #include <tuple>
  #include <assert.h>

  static const char* s = "hello world";

  int main ()
  {
    const std::tuple<const char*> t (s);
    assert (std::get<0>(t) == s);

    return 0;
  }
  $ good

  $ gmake t && ./t && echo good
  gcc -c -I/amd/devco/vitek/stdcxx/4.3.x/include/ansi -D_RWSTDDEBUG
-D_RWSTD_EXT_CXX_0X -I/amd/devco/vitek/stdcxx/4.3.x/include
-I/build/vitek/4.3.0/11S/include
-I/amd/devco/vitek/stdcxx/4.3.x/tests/include -pedantic -nostdinc++ -g
-std=gnu++0x -W -Wall -Wcast-qual -Winline -Wshadow -Wwrite-strings
-Wno-long-long -Wcast-align -Wno-empty-body -Wno-parentheses t.cpp
  gcc t.o -o t -L/build/vitek/4.3.0/11S/rwtest -lrwtest11S
-L/build/vitek/4.3.0/11S/lib -lstd11S -lsupc++ -lm
  good

>Martin
>
>

Reply via email to