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
>
>