Interesting. I've coded a lot of 2d tile-based scrolling engines over the years, and no matter what the API, always found it best to implement the classic approach if I needed sub-tile (i.e pixel) scrolling:
1) Create an offscreen buffer that is two tiles wider/higher than the display area.
2) predraw the buffer ONCE, using the individual tiles
3)in the render loop, do one large blit, the size of the display, from the buffer, using scroll offsets to position the source rectangle for the blit.
4)if the player has scrolled more than one tile in any direction, update the offscreen buffer by resetting the scroll offsets and either:
a) shuffling rows or columns of tiles on the offscreen buffer (blits with same source and destination that do not overlap), then drawing in the new row or column of tiles as individual tile blits, or
b)do one large blit from the offscreen buffer to a second offscreen buffer, shifted by one row/column, that becomes the new offscreen buffer for our tilemap, and then fill in the new row/column with individual tile blits.
The benefit can be seen by supposing you have a 40x30 tile display: for many frames, your tiled background goes from 1200+ blits down to ONE blit, and even when the scrolling reaches the buffer edge and has to update ala #4, it goes down to either 33 or 43 blits for that one frame (using the ping=ponging offscreen buffers method, or 63 or 83 for the single buffer method). Yes, some of those blits are larger in area than the individual tile blits that make up updating a 1200+ blit screen, but in most APIs, doing one large blit is about the same speed as doing one small blit.
I can't imagine what optimizations SFML has that make the above not true anymore; can someone enlighten me? Now, I can see possibly in SFML 2 that Views might be used as part of the above 4 steps, but I don't see how that changes the steps. I'm quite willing to learn new tricks, though!
Also, something close to the above is beneficial even if you are doing whole-tile scrolling, but the offscreen buffer need not be any bigger than the intended display area, and it gets updated on every scroll. Still better than doing 1200 blits.